[cfe-commits] r154189 - in /cfe/trunk: lib/Sema/SemaExpr.cpp lib/Sema/TreeTransform.h test/CodeGenObjCXX/arc.mm

Matt Beaumont-Gay matthewbg at google.com
Fri Apr 6 11:30:55 PDT 2012


This fixes both my and kcc's reduced testcases from PR12481. Thanks!

On Fri, Apr 6, 2012 at 11:20, John McCall <rjmccall at apple.com> wrote:
> Author: rjmccall
> Date: Fri Apr  6 13:20:53 2012
> New Revision: 154189
>
> URL: http://llvm.org/viewvc/llvm-project?rev=154189&view=rev
> Log:
> Fix a Sema invariant bug that I recently introduced involving
> 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.
>
> Modified:
>    cfe/trunk/lib/Sema/SemaExpr.cpp
>    cfe/trunk/lib/Sema/TreeTransform.h
>    cfe/trunk/test/CodeGenObjCXX/arc.mm
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=154189&r1=154188&r2=154189&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Apr  6 13:20:53 2012
> @@ -8567,6 +8567,9 @@
>  }
>
>  void Sema::ActOnStmtExprError() {
> +  // Note that function is also called by TreeTransform when leaving a
> +  // StmtExpr scope without rebuilding anything.
> +
>   DiscardCleanupsInEvaluationContext();
>   PopExpressionEvaluationContext();
>  }
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=154189&r1=154188&r2=154189&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Fri Apr  6 13:20:53 2012
> @@ -6736,14 +6736,20 @@
>  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(),
>
> Modified: cfe/trunk/test/CodeGenObjCXX/arc.mm
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/arc.mm?rev=154189&r1=154188&r2=154189&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenObjCXX/arc.mm (original)
> +++ cfe/trunk/test/CodeGenObjCXX/arc.mm Fri Apr  6 13:20:53 2012
> @@ -241,3 +241,14 @@
>  // 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>;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list