]> granicus.if.org Git - clang/commitdiff
Sema: Don't crash when __try/__except/__finally appears in a template function
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 15 Oct 2013 09:30:14 +0000 (09:30 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 15 Oct 2013 09:30:14 +0000 (09:30 +0000)
We wouldn't transform the compound statement in any of these forms,
causing crashes when it got time to act on them.  Additionally, we
wouldn't check to see if the handler was invalid before deciding whether
or not we should continue acting on the __try.

This fixes PR17584.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192682 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaCXX/__try.cpp

index 977d0132b7e0de214dee6b5580b21514717112a3..831c8e89d3e5cf98ec7da657baf8085f0c2c126e 100644 (file)
@@ -6233,10 +6233,13 @@ TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
 template<typename Derived>
 StmtResult
 TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
-  StmtResult TryBlock; //  = getDerived().TransformCompoundStmt(S->getTryBlock());
+  StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
   if(TryBlock.isInvalid()) return StmtError();
 
   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
+  if (Handler.isInvalid())
+    return StmtError();
+
   if(!getDerived().AlwaysRebuild() &&
      TryBlock.get() == S->getTryBlock() &&
      Handler.get() == S->getHandler())
@@ -6251,7 +6254,7 @@ TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
 template<typename Derived>
 StmtResult
 TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
-  StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());
+  StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
   if(Block.isInvalid()) return StmtError();
 
   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(),
@@ -6264,7 +6267,7 @@ TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
   if(FilterExpr.isInvalid()) return StmtError();
 
-  StmtResult Block; //  = getDerived().TransformCompoundStatement(S->getBlock());
+  StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
   if(Block.isInvalid()) return StmtError();
 
   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(),
index a0f503abe6c8fb2cff73ef07be1620b93e72cb9f..1c45581b32f9d3b6290766904386fcb000d8adf3 100644 (file)
@@ -57,3 +57,23 @@ int main()
   }
   return e;
 }
+
+namespace PR17584 {
+template <typename>
+void Except() {
+  __try {
+  } __except(true) {
+  }
+}
+
+template <typename>
+void Finally() {
+  __try {
+  } __finally {
+  }
+}
+
+template void Except<void>();
+template void Finally<void>();
+
+}