diff options
| author | Senran Zhang <zsrkmyn@gmail.com> | 2019-11-26 10:15:14 +0800 | 
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2019-11-25 18:15:34 -0800 | 
| commit | 01d8e09fdba0c9d3fe316a86e5ce4481e6ed71d1 (patch) | |
| tree | c874d9f150926ac845ade10a276a597f9b4e5313 /clang/test | |
| parent | 6f773205cd05e47912096d7c4091f03c28255ab2 (diff) | |
| download | bcm5719-llvm-01d8e09fdba0c9d3fe316a86e5ce4481e6ed71d1.tar.gz bcm5719-llvm-01d8e09fdba0c9d3fe316a86e5ce4481e6ed71d1.zip  | |
[clang][CodeGen] Fix wrong memcpy size of no_unique_address in FieldMemcpyizer
When generating ctor, FieldMemcpyizer wrongly treated zero-sized class members
as what should be copied, and generated wrong memcpy size under some special
circumstances. This patch tries to fix it.
Reviewed By: MaskRay, rjmccall
Differential Revision: https://reviews.llvm.org/D70671
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/CodeGenCXX/no-unique-address-2.cpp | 25 | 
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/no-unique-address-2.cpp b/clang/test/CodeGenCXX/no-unique-address-2.cpp new file mode 100644 index 00000000000..aa0c67758a1 --- /dev/null +++ b/clang/test/CodeGenCXX/no-unique-address-2.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -std=c++2a %s -emit-llvm -o - -triple x86_64-linux-gnu | FileCheck %s + +struct TriviallyCopyable {}; + +struct NonTriviallyCopyable { +  NonTriviallyCopyable() = default; +  NonTriviallyCopyable(const NonTriviallyCopyable&) = default; +  NonTriviallyCopyable(NonTriviallyCopyable &&) {} +}; + +struct Foo { +  int i; +  [[no_unique_address]] TriviallyCopyable m; +  [[no_unique_address]] NonTriviallyCopyable n; +}; + +void call() { +  Foo foo; +  Foo foo2(static_cast<Foo&&>(foo)); +} + +// The memcpy call should copy exact 4 bytes for member 'int i' +// CHECK: define {{.*}} void @_ZN3FooC2EOS_ +// CHECK:  call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.+}}, i8* {{.+}}, i64 4, i1 false) +// CHECK:  call void @_ZN20NonTriviallyCopyableC2EOS_  | 

