diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-05-11 00:17:17 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-05-11 00:17:17 +0000 |
commit | 97a2cdbff3df10f032f99bf3306fd5dd2c5d4cd1 (patch) | |
tree | 93ee0eeb793051c3c84e38707520515535d8eeb9 /clang/test/CodeGenCXX/array-default-argument.cpp | |
parent | bfb8e189d224c7bc9764d5512f4342c546da31b1 (diff) | |
download | llvm-97a2cdbff3df10f032f99bf3306fd5dd2c5d4cd1.zip llvm-97a2cdbff3df10f032f99bf3306fd5dd2c5d4cd1.tar.gz llvm-97a2cdbff3df10f032f99bf3306fd5dd2c5d4cd1.tar.bz2 |
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!
llvm-svn: 302750
Diffstat (limited to 'clang/test/CodeGenCXX/array-default-argument.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/array-default-argument.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/array-default-argument.cpp b/clang/test/CodeGenCXX/array-default-argument.cpp new file mode 100644 index 0000000..1fba485 --- /dev/null +++ b/clang/test/CodeGenCXX/array-default-argument.cpp @@ -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( +} |