Author: timshen Date: Tue Feb 14 17:46:37 2017 New Revision: 295123 URL: http://llvm.org/viewvc/llvm-project?rev=295123&view=rev Log: [VLA] Handle VLA size expression in a full-expression context.
Summary: Previously the cleanups (e.g. dtor calls) are inserted into the outer scope (e.g. function body scope), instead of it's own scope. After the fix, the cleanups are inserted right after getting the size value. This fixes pr30306. Reviewers: rsmith Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D24333 Added: cfe/trunk/test/Sema/pr30306.cpp Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp cfe/trunk/lib/Sema/TreeTransform.h Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=295123&r1=295122&r2=295123&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Tue Feb 14 17:46:37 2017 @@ -3864,6 +3864,8 @@ void Sema::InstantiateFunctionDefinition if (Body.isInvalid()) Function->setInvalidDecl(); + // FIXME: finishing the function body while in an expression evaluation + // context seems wrong. Investigate more. ActOnFinishFunctionBody(Function, Body.get(), /*IsInstantiation=*/true); Modified: cfe/trunk/lib/Sema/TreeTransform.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=295123&r1=295122&r2=295123&view=diff ============================================================================== --- cfe/trunk/lib/Sema/TreeTransform.h (original) +++ cfe/trunk/lib/Sema/TreeTransform.h Tue Feb 14 17:46:37 2017 @@ -4603,8 +4603,15 @@ TreeTransform<Derived>::TransformVariabl if (ElementType.isNull()) return QualType(); - ExprResult SizeResult - = getDerived().TransformExpr(T->getSizeExpr()); + ExprResult SizeResult; + { + EnterExpressionEvaluationContext Context(SemaRef, + Sema::PotentiallyEvaluated); + SizeResult = getDerived().TransformExpr(T->getSizeExpr()); + } + if (SizeResult.isInvalid()) + return QualType(); + SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get()); if (SizeResult.isInvalid()) return QualType(); Added: cfe/trunk/test/Sema/pr30306.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/pr30306.cpp?rev=295123&view=auto ============================================================================== --- cfe/trunk/test/Sema/pr30306.cpp (added) +++ cfe/trunk/test/Sema/pr30306.cpp Tue Feb 14 17:46:37 2017 @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -x c++ -emit-llvm < %s | FileCheck %s + +struct A { A(int); ~A(); }; +int f(const A &); +// CHECK: call void @_ZN1AC1Ei +// CHECK-NEXT: call i32 @_Z1fRK1A +// CHECK-NEXT: call void @_ZN1AD1Ev +// CHECK: call void @_ZN1AC1Ei +// CHECK-NEXT: call i32 @_Z1fRK1A +// CHECK-NEXT: call void @_ZN1AD1Ev +template<typename T> void g() { + int a[f(3)]; + int b[f(3)]; +} +int main() { g<int>(); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits