diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-10-28 18:59:51 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-10-28 18:59:51 +0000 |
commit | abf6311767c074d44e74d01bb83b96c9ba7fb3ff (patch) | |
tree | 0a87ec86f394c0530c54a29dde8d9ce4df7c8aa1 /test/CodeGenCXX/cxx1z-copy-omission.cpp | |
parent | 5d548d284e653240a44965a6b3ce891de8435341 (diff) |
PR35039: Materialize temporary objects before wrapping them in an
OpaqueValueExpr in a GNU binary conditional expression.
It's not meaningful for a non-materialized temporary object to be used as a
common subexpression of multiple expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@316836 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/cxx1z-copy-omission.cpp')
-rw-r--r-- | test/CodeGenCXX/cxx1z-copy-omission.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/test/CodeGenCXX/cxx1z-copy-omission.cpp b/test/CodeGenCXX/cxx1z-copy-omission.cpp index 234e4b1258..b33a218081 100644 --- a/test/CodeGenCXX/cxx1z-copy-omission.cpp +++ b/test/CodeGenCXX/cxx1z-copy-omission.cpp @@ -6,6 +6,8 @@ struct A { A(const A&); ~A(); + operator bool(); + int arr[10]; }; @@ -79,3 +81,27 @@ void i() { // CHECK-LABEL: } } + +// CHECK-LABEL: define {{.*}} @_Z1jv( +void j() { + // CHECK: alloca %{{.*}}* + // CHECK: %[[OUTERTEMP:.*]] = alloca %{{.*}} + // CHECK: %[[INNERTEMP:.*]] = alloca %{{.*}} + // CHECK: call void @_ZN1AC1Ei(%{{.*}} %[[INNERTEMP]], i32 1) + // CHECK: call zeroext i1 @_ZN1AcvbEv(%{{.*}} %[[INNERTEMP]]) + // CHECK: br i1 + // + // CHECK: call void @_ZN1AC1EOS_(%{{.*}} %[[OUTERTEMP]], %{{.*}} %[[INNERTEMP]]) + // CHECK: br label + // + // CHECK: call void @_ZN1AC1Ei(%{{.*}} %[[OUTERTEMP]], i32 2) + // CHECK: br label + // + // CHECK: call void @_ZN1AD1Ev(%{{.*}} %[[INNERTEMP]]) + A &&a = A(1) ?: A(2); + + // CHECK: call void @_Z1iv() + i(); + + // CHECK: call void @_ZN1AD1Ev(%{{.*}} %[[OUTERTEMP]]) +} |