[cfe-commits] r151172 - in /cfe/trunk: lib/CodeGen/CGExprCXX.cpp test/CodeGenCXX/new-array-init-exceptions.cpp
Chad Rosier
mcrosier at apple.com
Wed Feb 22 12:46:25 PST 2012
Hi Sebastian,
The test you added here is failing on one of our internal buildbots.
Here's the exact errors:
******************** TEST 'Clang :: CodeGenCXX/new-array-init-exceptions.cpp' FAILED ********************Script:
--
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang-build/Release/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang-build/Release/bin/../lib/clang/3.1/include -std=c++11 -triple i386-unknown-unknown -fexceptions -fcxx-exceptions /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang.src/test/CodeGenCXX/new-array-init-exceptions.cpp -emit-llvm -o - | FileCheck /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang.src/test/CodeGenCXX/new-array-init-exceptions.cpp
--
Exit Code: 1
Command Output (stderr):
--
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang.src/test/CodeGenCXX/new-array-init-exceptions.cpp:20:12: error: expected string not found in input
// CHECK: [[LPAD]]:
^
<stdin>:56:1: note: scanning from here
; <label>:27 ; preds = %25
^
<stdin>:56:1: note: with variable "LPAD" equal to "31"
; <label>:27 ; preds = %25
^
<stdin>:56:10: note: possible intended match here
; <label>:27 ; preds = %25
^
--
********************
Chad
On Feb 22, 2012, at 9:37 AM, Sebastian Redl wrote:
> Author: cornedbee
> Date: Wed Feb 22 11:37:59 2012
> New Revision: 151172
>
> URL: http://llvm.org/viewvc/llvm-project?rev=151172&view=rev
> Log:
> Unwind path cleanup for array new list initializers.
>
> Added:
> cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp
> Modified:
> cfe/trunk/lib/CodeGen/CGExprCXX.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=151172&r1=151171&r2=151172&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Wed Feb 22 11:37:59 2012
> @@ -804,12 +804,32 @@
> unsigned initializerElements = 0;
>
> const Expr *Init = E->getInitializer();
> + llvm::AllocaInst *endOfInit = 0;
> + QualType::DestructionKind dtorKind = elementType.isDestructedType();
> + EHScopeStack::stable_iterator cleanup;
> + llvm::Instruction *cleanupDominator = 0;
> // If the initializer is an initializer list, first do the explicit elements.
> if (const InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
> initializerElements = ILE->getNumInits();
> - QualType elementType = E->getAllocatedType();
> - // FIXME: exception-safety for the explicit initializers
> +
> + // Enter a partial-destruction cleanup if necessary.
> + if (needsEHCleanup(dtorKind)) {
> + // In principle we could tell the cleanup where we are more
> + // directly, but the control flow can get so varied here that it
> + // would actually be quite complex. Therefore we go through an
> + // alloca.
> + endOfInit = CreateTempAlloca(beginPtr->getType(), "array.endOfInit");
> + cleanupDominator = Builder.CreateStore(beginPtr, endOfInit);
> + pushIrregularPartialArrayCleanup(beginPtr, endOfInit, elementType,
> + getDestroyer(dtorKind));
> + cleanup = EHStack.stable_begin();
> + }
> +
> for (unsigned i = 0, e = ILE->getNumInits(); i != e; ++i) {
> + // Tell the cleanup that it needs to destroy up to this
> + // element. TODO: some of these stores can be trivially
> + // observed to be unnecessary.
> + if (endOfInit) Builder.CreateStore(explicitPtr, endOfInit);
> StoreAnyExprIntoOneUnit(*this, ILE->getInit(i), elementType, explicitPtr);
> explicitPtr =Builder.CreateConstGEP1_32(explicitPtr, 1, "array.exp.next");
> }
> @@ -825,7 +845,12 @@
> // anything left to initialize.
> if (llvm::ConstantInt *constNum = dyn_cast<llvm::ConstantInt>(numElements)) {
> // If all elements have already been initialized, skip the whole loop.
> - if (constNum->getZExtValue() <= initializerElements) return;
> + if (constNum->getZExtValue() <= initializerElements) {
> + // If there was a cleanup, deactivate it.
> + if (cleanupDominator)
> + DeactivateCleanupBlock(cleanup, cleanupDominator);;
> + return;
> + }
> } else {
> llvm::BasicBlock *nonEmptyBB = createBasicBlock("new.loop.nonempty");
> llvm::Value *isEmpty = Builder.CreateICmpEQ(explicitPtr, endPtr,
> @@ -845,11 +870,11 @@
> Builder.CreatePHI(explicitPtr->getType(), 2, "array.cur");
> curPtr->addIncoming(explicitPtr, entryBB);
>
> + // Store the new cleanup position for irregular cleanups.
> + if (endOfInit) Builder.CreateStore(curPtr, endOfInit);
> +
> // Enter a partial-destruction cleanup if necessary.
> - QualType::DestructionKind dtorKind = elementType.isDestructedType();
> - EHScopeStack::stable_iterator cleanup;
> - llvm::Instruction *cleanupDominator = 0;
> - if (needsEHCleanup(dtorKind)) {
> + if (!cleanupDominator && needsEHCleanup(dtorKind)) {
> pushRegularPartialArrayCleanup(beginPtr, curPtr, elementType,
> getDestroyer(dtorKind));
> cleanup = EHStack.stable_begin();
>
> Added: cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp?rev=151172&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp Wed Feb 22 11:37:59 2012
> @@ -0,0 +1,40 @@
> +// RUN: %clang_cc1 -std=c++11 -triple i386-unknown-unknown -fexceptions -fcxx-exceptions %s -emit-llvm -o - | FileCheck %s
> +
> +struct Throws {
> + Throws(int);
> + Throws();
> + ~Throws();
> +};
> +
> +// CHECK: define void @_Z7cleanupi
> +void cleanup(int n) {
> + // CHECK: invoke void @_ZN6ThrowsC1Ei
> + // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD:[^ ]+]]
> + // CHECK: invoke void @_ZN6ThrowsC1Ei
> + // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]]
> + // CHECK: invoke void @_ZN6ThrowsC1Ei
> + // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]]
> + // CHECK: invoke void @_ZN6ThrowsC1Ev
> + // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]]
> + new Throws[n] { 1, 2, 3 };
> + // CHECK: [[LPAD]]:
> + // CHECK-NEXT: landingpad
> + // CHECK: call void @_ZN6ThrowsD1Ev
> + // CHECK: call void @_ZdaPv
> +}
> +
> +
> +// CHECK: define void @_Z7cleanupv
> +void cleanup() {
> + // CHECK: invoke void @_ZN6ThrowsC1Ei
> + // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2:[^ ]+]]
> + // CHECK: invoke void @_ZN6ThrowsC1Ei
> + // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2]]
> + // CHECK: invoke void @_ZN6ThrowsC1Ei
> + // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2]]
> + new Throws[3] { 1, 2, 3 };
> + // CHECK: [[LPAD2]]:
> + // CHECK-NEXT: landingpad
> + // CHECK: call void @_ZN6ThrowsD1Ev
> + // CHECK: call void @_ZdaPv
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120222/6e905ef3/attachment.html>
More information about the cfe-commits
mailing list