<div dir="ltr">Ah, right - thanks for reminding/explaining!</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Oct 24, 2016 at 2:42 PM Tim Shen <<a href="mailto:timshen@google.com">timshen@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Mon, Oct 24, 2016 at 2:38 PM David Blaikie <<a href="mailto:dblaikie@gmail.com" class="gmail_msg" target="_blank">dblaikie@gmail.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Simplify it further by replacing A() with just a function instead of a class? Or does that break the repro?<br class="gmail_msg"><br class="gmail_msg">bool Foo();<br class="gmail_msg">void Bar();<br class="gmail_msg">void Baz() {<br class="gmail_msg">  if (False && Foo())<br class="gmail_msg">    Bar();<br class="gmail_msg">}</div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">This actually breaks the repro. My test introduces a non-trivially destructible temporary object in the condition expression, which creates a ExprWithCleanups node at the full expression entry.</div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Mon, Oct 24, 2016 at 1:38 PM Tim Shen <<a href="mailto:timshen@google.com" class="gmail_msg" target="_blank">timshen@google.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Mon, Oct 24, 2016 at 10:33 AM David Blaikie <<a href="mailto:dblaikie@gmail.com" class="gmail_msg" target="_blank">dblaikie@gmail.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Mon, Aug 29, 2016 at 3:45 PM Tim Shen via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">timshen created this revision.<br class="gmail_msg">
timshen added reviewers: rsmith, pirama.<br class="gmail_msg">
timshen added a subscriber: cfe-commits.<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D24010" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D24010</a><br class="gmail_msg">
<br class="gmail_msg">
Files:<br class="gmail_msg">
  clang/include/clang/AST/Stmt.h<br class="gmail_msg">
  clang/lib/Analysis/ReachableCode.cpp<br class="gmail_msg">
  clang/test/SemaCXX/PR29152.cpp<br class="gmail_msg">
<br class="gmail_msg">
Index: clang/test/SemaCXX/PR29152.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- /dev/null<br class="gmail_msg">
+++ clang/test/SemaCXX/PR29152.cpp<br class="gmail_msg">
@@ -0,0 +1,19 @@<br class="gmail_msg">
+// RUN: %clang_cc1 -fsyntax-only -Wunreachable-code -verify %s<br class="gmail_msg">
+<br class="gmail_msg">
+static const bool False = false;<br class="gmail_msg">
+<br class="gmail_msg">
+struct Vector {<br class="gmail_msg">
+  struct iterator {<br class="gmail_msg">
+    bool operator==(const iterator &) const;<br class="gmail_msg">
+  };<br class="gmail_msg">
+  iterator end();<br class="gmail_msg">
+};<br class="gmail_msg">
+<br class="gmail_msg">
+void Bar();<br class="gmail_msg">
+Vector::iterator Find(Vector &a);<br class="gmail_msg">
+<br class="gmail_msg">
+void Foo(Vector &a) {<br class="gmail_msg">
+  if (False && Find(a) == a.end()) {<br class="gmail_msg">
+    Bar(); // expected-no-diagnostics<br class="gmail_msg">
+  }<br class="gmail_msg">
+}<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">What are the relevant parts of this test for this change?<br class="gmail_msg"><br class="gmail_msg">Is it the static const bool False that's interesting?<br class="gmail_msg"><br class="gmail_msg">Is it the op==/other interesting side effects on the RHS that are interesting?<br class="gmail_msg"><br class="gmail_msg">I'd be surprised if it were both (& if it isn't both, I'm guessing it's the former rather than the latter - in which case the latter can probably be reduced to just an arbitrary function call to, say: bool Baz())</div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">It's the static const bool False. I actually managed to simplify the code to remove the operator==() call.</div></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"></blockquote></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Index: clang/lib/Analysis/ReachableCode.cpp<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- clang/lib/Analysis/ReachableCode.cpp<br class="gmail_msg">
+++ clang/lib/Analysis/ReachableCode.cpp<br class="gmail_msg">
@@ -164,6 +164,8 @@<br class="gmail_msg">
   if (!S)<br class="gmail_msg">
     return false;<br class="gmail_msg">
<br class="gmail_msg">
+  S = S->IgnoreImplicit();<br class="gmail_msg">
+<br class="gmail_msg">
   if (const Expr *Ex = dyn_cast<Expr>(S))<br class="gmail_msg">
     S = Ex->IgnoreCasts();<br class="gmail_msg">
<br class="gmail_msg">
Index: clang/include/clang/AST/Stmt.h<br class="gmail_msg">
===================================================================<br class="gmail_msg">
--- clang/include/clang/AST/Stmt.h<br class="gmail_msg">
+++ clang/include/clang/AST/Stmt.h<br class="gmail_msg">
@@ -387,6 +387,9 @@<br class="gmail_msg">
   /// Skip past any implicit AST nodes which might surround this<br class="gmail_msg">
   /// statement, such as ExprWithCleanups or ImplicitCastExpr nodes.<br class="gmail_msg">
   Stmt *IgnoreImplicit();<br class="gmail_msg">
+  const Stmt *IgnoreImplicit() const {<br class="gmail_msg">
+    return const_cast<Stmt *>(this)->IgnoreImplicit();<br class="gmail_msg">
+  }<br class="gmail_msg">
<br class="gmail_msg">
   /// \brief Skip no-op (attributed, compound) container stmts and skip captured<br class="gmail_msg">
   /// stmt at the top, if \a IgnoreCaptured is true.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg"></blockquote></div></div><div dir="ltr" class="gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
_______________________________________________<br class="gmail_msg">
cfe-commits mailing list<br class="gmail_msg">
<a href="mailto:cfe-commits@lists.llvm.org" class="gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="gmail_msg">
</blockquote></div></div>
</blockquote></div></div></blockquote></div>
</blockquote></div></div></blockquote></div>