]> granicus.if.org Git - clang/commitdiff
Fix a Sema invariant bug that I recently introduced involving
authorJohn McCall <rjmccall@apple.com>
Fri, 6 Apr 2012 18:20:53 +0000 (18:20 +0000)
committerJohn McCall <rjmccall@apple.com>
Fri, 6 Apr 2012 18:20:53 +0000 (18:20 +0000)
the template instantiation of statement-expressions.

I think it was jyasskin who had a crashing testcase in this area;
hopefully this fixes it and he can find his testcase and check it in.

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

lib/Sema/SemaExpr.cpp
lib/Sema/TreeTransform.h
test/CodeGenObjCXX/arc.mm

index 709b944447e08c4ce590ea1740af2da61b9aa59d..82d23783f91725ca80dd5c256ae74e4ee44f9b5a 100644 (file)
@@ -8567,6 +8567,9 @@ void Sema::ActOnStartStmtExpr() {
 }
 
 void Sema::ActOnStmtExprError() {
+  // Note that function is also called by TreeTransform when leaving a
+  // StmtExpr scope without rebuilding anything.
+
   DiscardCleanupsInEvaluationContext();
   PopExpressionEvaluationContext();
 }
index f16b667a658d2b5e542090500f8c2f2aecfe190d..fdb861eea51b63651b51e50673ba0ce639b75cb5 100644 (file)
@@ -6736,14 +6736,20 @@ TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
 template<typename Derived>
 ExprResult 
 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
+  SemaRef.ActOnStartStmtExpr();
   StmtResult SubStmt
     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
-  if (SubStmt.isInvalid())
+  if (SubStmt.isInvalid()) {
+    SemaRef.ActOnStmtExprError();
     return ExprError();
+  }
 
   if (!getDerived().AlwaysRebuild() &&
-      SubStmt.get() == E->getSubStmt())
+      SubStmt.get() == E->getSubStmt()) {
+    // Calling this an 'error' is unintuitive, but it does the right thing.
+    SemaRef.ActOnStmtExprError();
     return SemaRef.MaybeBindToTemporary(E);
+  }
 
   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
                                       SubStmt.get(),
index 7b7429085fbf9335344fcd8db5e81777ebdc7dfd..45211a2c19ab28c7cdddcced91fb04e4afeabd83 100644 (file)
@@ -241,3 +241,14 @@ Test37 *instantiate_init() {
 // CHECK: call i8* @objc_autoreleaseReturnValue
 template Test37* instantiate_init<int>();
 
+// Just make sure that the AST invariants hold properly here,
+// i.e. that we don't crash.
+// The block should get bound in the full-expression outside
+// the statement-expression.
+template <class T> class Test38 {
+  void test(T x) {
+    ^{ (void) x; }, ({ x; });
+  }
+};
+// CHECK: define weak_odr void @_ZN6Test38IiE4testEi(
+template class Test38<int>;