r302750 - PR22877: When constructing an array via a constructor with a default argument

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu May 11 12:14:03 PDT 2017


Thanks for the revert, fixed up and recommitted in r302817.

Any idea why not a single buildbot sent me any email about this? :( (A
couple of them were red at the previous change too, but some of them were
not (eg. clang-cmake-armv7-a15).

On 11 May 2017 at 01:28, Diana Picus <diana.picus at linaro.org> wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170511/181049e6/attachment.html>


More information about the cfe-commits mailing list