<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Aug 23, 2017 at 12:11 PM, Reid Kleckner via Phabricator via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">rnk added inline comments.<br>
<span class="gmail-"><br>
<br>
================<br>
Comment at: test/Sema/warn-unreachable-ms.<wbr>c:42<br>
+  }<br>
+}<br>
----------------<br>
rnk wrote:<br>
> rnk wrote:<br>
> > Can we add a test to exercise that this builds the right CFG?<br>
> > ```<br>
> > __try {<br>
> >   __try {<br>
> >     f();<br>
> >   } __except(1) {<br>
> >     __leave; // should exit outer try<br>
> >   }<br>
> >   __leave;<br>
> >   f(); // expected-warning{{never be executed}}<br>
> > } __except(1) {<br>
> > }<br>
> > ```<br>
> > Sure. Did you intentionally put two __leaves in there, or do you only want the one in the inner __except?<br>
><br>
> I think both are required to trigger the warning in case f() doesn't throw, but I could be wrong.<br>
</span>I woke up this morning and realized what you meant. Is there another way we can check that __leave in __except exits the outer __try?</blockquote><div><br></div><div>How does this look?</div><div><br></div><div>$ svn diff test/Sema</div><div>Index: test/Sema/warn-unreachable-ms.c</div><div>===================================================================</div><div>--- test/Sema/warn-unreachable-ms.c<span style="white-space:pre"> </span>(revision 311564)</div><div>+++ test/Sema/warn-unreachable-ms.c<span style="white-space:pre">  </span>(working copy)</div><div>@@ -1,4 +1,5 @@</div><div> // RUN: %clang_cc1 %s -triple=i686-pc-win32 -fsyntax-only -verify -fms-extensions -Wunreachable-code</div><div>+// RUN: %clang_cc1 %s -triple=i686-pc-win32 -fsyntax-only -verify -fms-extensions -Wunreachable-code -x c++ -fcxx-exceptions -DWITH_THROW</div><div> </div><div> void f();</div><div> </div><div>@@ -41,15 +42,16 @@</div><div>   }</div><div> }</div><div> </div><div>+#if defined(WITH_THROW)</div><div> void g3() {</div><div>   __try {</div><div>     __try {</div><div>-      f();</div><div>+      throw 1;</div><div>     } __except (1) {</div><div>       __leave; // should exit outer try</div><div>     }</div><div>-    __leave;</div><div>     f(); // expected-warning{{never be executed}}</div><div>   } __except (1) {</div><div>   }</div><div> }</div><div>+#endif </div></div></div></div>