1 // RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - -std=c++11 |FileCheck %s
2 
3 class x {
4 public: int operator=(int);
5 };
a()6 void a() {
7   x a;
8   a = 1u;
9 }
10 
f(int i,int j)11 void f(int i, int j) {
12   // CHECK: load i32
13   // CHECK: load i32
14   // CHECK: add nsw i32
15   // CHECK: store i32
16   // CHECK: store i32 17, i32
17   // CHECK: ret
18   (i += j) = 17;
19 }
20 
21 // Taken from g++.old-deja/g++.jason/net.C
22 namespace test1 {
fn(T t)23   template <class T> void fn (T t) { }
24   template <class T> struct A {
25     void (*p)(T);
Atest1::A26     A() { p = fn; }
27   };
28 
29   A<int> a;
30 }
31 
32 // Ensure that we use memcpy when we would have selected a trivial assignment
33 // operator, even for a non-trivially-copyable type.
34 struct A {
35   A &operator=(const A&);
36 };
37 struct B {
38   B(const B&);
39   B &operator=(const B&) = default;
40   int n;
41 };
42 struct C {
43   A a;
44   B b[16];
45 };
b(C & a,C & b)46 void b(C &a, C &b) {
47   // CHECK: define {{.*}} @_ZN1CaSERKS_(
48   // CHECK: call {{.*}} @_ZN1AaSERKS_(
49   // CHECK-NOT: call {{.*}} @_ZN1BaSERKS_(
50   // CHECK: call {{.*}} @{{.*}}memcpy
51   // CHECK-NOT: call {{.*}} @_ZN1BaSERKS_(
52   // CHECK: }
53   a = b;
54 }
55