From 993f25a2f9a852509c61abf1c167b6421890bb39 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 7 Nov 2012 23:56:21 +0000 Subject: When deciding whether to convert an array construction loop into a memcpy, look at whether the *selected* constructor would be trivial rather than considering whether the array's element type has *any* non-trivial constructors of the relevant kind. llvm-svn: 167562 --- .../test/CodeGenCXX/implicit-copy-constructor.cpp | 28 +++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'clang/test/CodeGenCXX/implicit-copy-constructor.cpp') diff --git a/clang/test/CodeGenCXX/implicit-copy-constructor.cpp b/clang/test/CodeGenCXX/implicit-copy-constructor.cpp index 8bc84a534b3..8a3a422e0ba 100644 --- a/clang/test/CodeGenCXX/implicit-copy-constructor.cpp +++ b/clang/test/CodeGenCXX/implicit-copy-constructor.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -std=c++11 | FileCheck %s struct A { A(); @@ -80,3 +80,29 @@ namespace test3 { y = x; } } + +namespace test4 { + // When determining whether to implement an array copy as a memcpy, look at + // whether the *selected* constructor is trivial. + struct S { + int arr[5][5]; + S(S &); + S(const S &) = default; + }; + // CHECK: @_ZN5test42f1 + void f1(S a) { + // CHECK-NOT: memcpy + // CHECK: call void @_ZN5test41SC1ERS0_ + // CHECK-NOT: memcpy + S b(a); + // CHECK: } + } + // CHECK: @_ZN5test42f2 + void f2(const S a) { + // CHECK-NOT: call void @_ZN5test41SC1ERS0_ + // CHECK: memcpy + // CHECK-NOT: call void @_ZN5test41SC1ERS0_ + S b(a); + // CHECK: } + } +} -- cgit v1.2.3