r302750 - PR22877: When constructing an array via a constructor with a default argument
Diana Picus via cfe-commits
cfe-commits at lists.llvm.org
Thu May 11 01:28:07 PDT 2017
Hexagon too:
http://lab.llvm.org:8011/builders/clang-hexagon-elf/builds/7916
On 11 May 2017 at 10:27, Diana Picus <diana.picus at linaro.org> wrote:
> Hi Richard,
>
> I reverted this and its fixup in r302776 since some of the ARM bots
> were still broken:
> http://lab.llvm.org:8011/builders/clang-cmake-armv7-a15/builds/6969
> http://lab.llvm.org:8011/builders/clang-cmake-thumbv7-a15/builds/6959
> http://lab.llvm.org:8011/builders/clang-cmake-armv7-a15-full/builds/6717
> http://lab.llvm.org:8011/builders/clang-cmake-thumbv7-a15-full-sh/builds/1518
>
> Sorry,
> Diana
>
> On 11 May 2017 at 02:17, Richard Smith via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>> Author: rsmith
>> Date: Wed May 10 19:17:17 2017
>> New Revision: 302750
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=302750&view=rev
>> Log:
>> PR22877: When constructing an array via a constructor with a default argument
>> in list-initialization, run cleanups for the default argument after each
>> iteration of the initialization loop.
>>
>> We previously only ran the destructor for any temporary once, at the end of the
>> complete loop, rather than once per iteration!
>>
>> Added:
>> cfe/trunk/test/CodeGenCXX/array-default-argument.cpp
>> Modified:
>> cfe/trunk/lib/CodeGen/CGExprAgg.cpp
>>
>> Modified: cfe/trunk/lib/CodeGen/CGExprAgg.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprAgg.cpp?rev=302750&r1=302749&r2=302750&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExprAgg.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExprAgg.cpp Wed May 10 19:17:17 2017
>> @@ -512,12 +512,20 @@ void AggExprEmitter::EmitArrayInit(Addre
>> currentElement->addIncoming(element, entryBB);
>>
>> // Emit the actual filler expression.
>> - LValue elementLV =
>> - CGF.MakeAddrLValue(Address(currentElement, elementAlign), elementType);
>> - if (filler)
>> - EmitInitializationToLValue(filler, elementLV);
>> - else
>> - EmitNullInitializationToLValue(elementLV);
>> + {
>> + // C++1z [class.temporary]p5:
>> + // when a default constructor is called to initialize an element of
>> + // an array with no corresponding initializer [...] the destruction of
>> + // every temporary created in a default argument is sequenced before
>> + // the construction of the next array element, if any
>> + CodeGenFunction::RunCleanupsScope CleanupsScope(CGF);
>> + LValue elementLV =
>> + CGF.MakeAddrLValue(Address(currentElement, elementAlign), elementType);
>> + if (filler)
>> + EmitInitializationToLValue(filler, elementLV);
>> + else
>> + EmitNullInitializationToLValue(elementLV);
>> + }
>>
>> // Move on to the next element.
>> llvm::Value *nextElement =
>>
>> Added: cfe/trunk/test/CodeGenCXX/array-default-argument.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/array-default-argument.cpp?rev=302750&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/array-default-argument.cpp (added)
>> +++ cfe/trunk/test/CodeGenCXX/array-default-argument.cpp Wed May 10 19:17:17 2017
>> @@ -0,0 +1,36 @@
>> +// RUN: %clang_cc1 -emit-llvm -o - %s -triple %itanium_abi_triple | FileCheck %s
>> +// RUN: %clang_cc1 -emit-llvm -o - %s -triple %itanium_abi_triple -fexceptions -fcxx-exceptions | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-EH
>> +
>> +struct A {
>> + A();
>> + ~A();
>> +};
>> +
>> +struct B {
>> + B(A = A());
>> + ~B();
>> +};
>> +
>> +void f();
>> +// CHECK-LABEL: define void @_Z1gv()
>> +void g() {
>> + // CHECK: br label %[[LOOP:.*]]
>> +
>> + // [[LOOP]]:
>> + // CHECK: {{call|invoke}} void @_ZN1AC1Ev([[TEMPORARY:.*]])
>> + // CHECK-EH: unwind label %[[PARTIAL_ARRAY_LPAD:.*]]
>> + // CHECK: {{call|invoke}} void @_ZN1BC1E1A({{.*}}, [[TEMPORARY]])
>> + // CHECK-EH: unwind label %[[A_AND_PARTIAL_ARRAY_LPAD:.*]]
>> + // CHECK: {{call|invoke}} void @_ZN1AD1Ev([[TEMPORARY]])
>> + // CHECK-EH: unwind label %[[PARTIAL_ARRAY_LPAD]]
>> + // CHECK: getelementptr {{.*}}, i{{[0-9]*}} 1
>> + // CHECK: icmp eq
>> + // CHECK: br i1 {{.*}} label %[[LOOP]]
>> + B b[5];
>> +
>> + // CHECK: {{call|invoke}} void @_Z1fv()
>> + f();
>> +
>> + // CHECK-NOT: @_ZN1AD1Ev(
>> + // CHECK: {{call|invoke}} void @_ZN1BD1Ev(
>> +}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list