<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 15, 2013 at 2:30 AM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: majnemer<br>
Date: Tue Oct 15 04:30:14 2013<br>
New Revision: 192682<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=192682&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=192682&view=rev</a><br>
Log:<br>
Sema: Don't crash when __try/__except/__finally appears in a template function<br>
<br>
We wouldn't transform the compound statement in any of these forms,<br>
causing crashes when it got time to act on them.  Additionally, we<br>
wouldn't check to see if the handler was invalid before deciding whether<br>
or not we should continue acting on the __try.<br>
<br>
This fixes PR17584.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/TreeTransform.h<br>
    cfe/trunk/test/SemaCXX/__try.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/TreeTransform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=192682&r1=192681&r2=192682&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=192682&r1=192681&r2=192682&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/TreeTransform.h (original)<br>
+++ cfe/trunk/lib/Sema/TreeTransform.h Tue Oct 15 04:30:14 2013<br>
@@ -6233,10 +6233,13 @@ TreeTransform<Derived>::TransformMSPrope<br>
 template<typename Derived><br>
 StmtResult<br>
 TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {<br>
-  StmtResult TryBlock; //  = getDerived().TransformCompoundStmt(S->getTryBlock());<br>
+  StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());<br></blockquote><div><br></div><div>Well, that's easy.  :)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

   if(TryBlock.isInvalid()) return StmtError();<br>
<br>
   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());<br>
+  if (Handler.isInvalid())<br>
+    return StmtError();<br>
+<br>
   if(!getDerived().AlwaysRebuild() &&<br>
      TryBlock.get() == S->getTryBlock() &&<br>
      Handler.get() == S->getHandler())<br>
@@ -6251,7 +6254,7 @@ TreeTransform<Derived>::TransformSEHTryS<br>
 template<typename Derived><br>
 StmtResult<br>
 TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {<br>
-  StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());<br>
+  StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());<br>
   if(Block.isInvalid()) return StmtError();<br>
<br>
   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(),<br>
@@ -6264,7 +6267,7 @@ TreeTransform<Derived>::TransformSEHExce<br>
   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());<br>
   if(FilterExpr.isInvalid()) return StmtError();<br>
<br>
-  StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());<br>
+  StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());<br>
   if(Block.isInvalid()) return StmtError();<br>
<br>
   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(),<br>
<br>
Modified: cfe/trunk/test/SemaCXX/__try.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/__try.cpp?rev=192682&r1=192681&r2=192682&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/__try.cpp?rev=192682&r1=192681&r2=192682&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/SemaCXX/__try.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/__try.cpp Tue Oct 15 04:30:14 2013<br>
@@ -57,3 +57,23 @@ int main()<br>
   }<br>
   return e;<br>
 }<br>
+<br>
+namespace PR17584 {<br>
+template <typename><br>
+void Except() {<br>
+  __try {<br>
+  } __except(true) {<br>
+  }<br>
+}<br>
+<br>
+template <typename><br>
+void Finally() {<br>
+  __try {<br>
+  } __finally {<br>
+  }<br>
+}<br>
+<br>
+template void Except<void>();<br>
+template void Finally<void>();<br>
+<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>