summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/TreeTransform.h9
-rw-r--r--clang/test/SemaCXX/__try.cpp20
2 files changed, 26 insertions, 3 deletions
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 977d0132b7e..831c8e89d3e 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -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(),
diff --git a/clang/test/SemaCXX/__try.cpp b/clang/test/SemaCXX/__try.cpp
index a0f503abe6c..1c45581b32f 100644
--- a/clang/test/SemaCXX/__try.cpp
+++ b/clang/test/SemaCXX/__try.cpp
@@ -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>();
+
+}
OpenPOWER on IntegriCloud