325 lines · cpp
1// RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-apple-darwin10 -emit-llvm -std=c++03 -fexceptions -fcxx-exceptions -o - %s | FileCheck %s2// RUN: %clang_cc1 -no-enable-noundef-analysis -triple i386-apple-darwin10 -emit-llvm -std=c++03 -o - %s | FileCheck --check-prefix=CHECK-2 %s3 4struct Empty {};5 6struct POD {7 int w, x, y, z;8};9 10struct PODLike {11 int w, x, y, z;12 PODLike();13 ~PODLike();14};15 16struct NonPOD {17 NonPOD();18 NonPOD(const NonPOD&);19 NonPOD& operator=(const NonPOD&);20};21 22struct Basic {23 int a, b, c, d;24 NonPOD np;25 int w, x, y, z;26};27 28struct PODMember {29 int a, b, c, d;30 POD p;31 NonPOD np;32 int w, x, y, z;33};34 35struct PODLikeMember {36 int a, b, c, d;37 PODLike pl;38 NonPOD np;39 int w, x, y, z;40};41 42struct ArrayMember {43 int a, b, c, d;44 int e[12];45 NonPOD np;46 int f[12];47 int w, x, y, z;48};49 50struct ZeroLengthArrayMember {51 NonPOD np;52 int a;53 int b[0];54 int c;55};56 57struct VolatileMember {58 int a, b, c, d;59 volatile int v;60 NonPOD np;61 int w, x, y, z;62};63 64struct BitfieldMember {65 int a, b, c, d;66 NonPOD np;67 int w : 6;68 int x : 6;69 int y : 6;70 int z : 6;71};72 73struct BitfieldMember2 {74 unsigned a : 1;75 unsigned b, c, d;76 NonPOD np;77};78 79struct BitfieldMember3 {80 virtual void f();81 int : 8;82 int x : 1;83 int y;84};85 86struct InnerClassMember {87 struct {88 int a, b, c, d;89 } a;90 int b, c, d, e;91 NonPOD np;92 int w, x, y, z;93};94 95struct ReferenceMember {96 ReferenceMember(int &a, int &b, int &c, int &d)97 : a(a), b(b), c(c), d(d) {}98 int &a;99 int &b;100 NonPOD np;101 int &c;102 int &d;103};104 105struct __attribute__((packed)) PackedMembers {106 char c;107 NonPOD np;108 int w, x, y, z;109};110 111struct WithEmptyField {112 int a;113 Empty e;114 NonPOD np;115 int b;116};117 118struct WithEmptyNUAField {119 int a;120 [[no_unique_address]] Empty e;121 NonPOD np;122 int b;123};124 125// COPY-ASSIGNMENT OPERATORS:126 127// Assignment operators are output in the order they're encountered.128 129#define CALL_AO(T) void callAO##T(T& a, const T& b) { a = b; } 130 131CALL_AO(Basic)132CALL_AO(PODMember)133CALL_AO(PODLikeMember)134CALL_AO(ArrayMember)135CALL_AO(ZeroLengthArrayMember)136CALL_AO(VolatileMember)137CALL_AO(BitfieldMember)138CALL_AO(InnerClassMember)139CALL_AO(PackedMembers)140CALL_AO(WithEmptyField)141CALL_AO(WithEmptyNUAField)142 143// Basic copy-assignment:144// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN5BasicaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)145// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})146// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_147// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})148// CHECK: ret ptr149 150// PODMember copy-assignment:151// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN9PODMemberaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)152// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 32, i1 {{.*}})153// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_154// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})155// CHECK: ret ptr156 157// PODLikeMember copy-assignment:158// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN13PODLikeMemberaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)159// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 32, i1 {{.*}})160// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_161// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})162// CHECK: ret ptr163 164// ArrayMember copy-assignment:165// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN11ArrayMemberaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)166// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 64, i1 {{.*}})167// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_168// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 64, i1 {{.*}})169// CHECK: ret ptr170 171// ZeroLengthArrayMember copy-assignment:172// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN21ZeroLengthArrayMemberaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)173// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_174// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 8, i1 {{.*}})175// CHECK: ret ptr176 177// VolatileMember copy-assignment:178// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN14VolatileMemberaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)179// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})180// CHECK: load volatile i32, ptr {{.*}}, align 4181// CHECK: store volatile i32 {{.*}}, align 4182// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_183// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})184// CHECK: ret ptr185 186// BitfieldMember copy-assignment:187// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN14BitfieldMemberaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)188// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})189// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_190// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 1 {{.*}} align 1 {{.*}}i64 3, i1 {{.*}})191// CHECK: ret ptr192 193// InnerClass copy-assignment:194// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN16InnerClassMemberaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)195// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 32, i1 {{.*}})196// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_197// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})198// CHECK: ret ptr199 200// PackedMembers copy-assignment:201// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN13PackedMembersaSERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)202// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_203// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 1 {{.*}} align 1 {{.*}}i64 16, i1 {{.*}})204// CHECK: ret ptr205 206// WithEmptyField copy-assignment:207// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN14WithEmptyFieldaSERKS_208// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 4, i1 {{.*}})209// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_210// CHECK: ret ptr211 212// WithEmptyNUAField copy-assignment:213// CHECK-LABEL: define linkonce_odr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN17WithEmptyNUAFieldaSERKS_214// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 4, i1 {{.*}})215// CHECK: call nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) ptr @_ZN6NonPODaSERKS_216// CHECK: ret ptr217 218// COPY-CONSTRUCTORS:219 220// Clang outputs copy-constructors in the reverse of the order that221// copy-constructor calls are encountered. Add functions that call the copy222// constructors of the classes above in reverse order here.223 224#define CALL_CC(T) T callCC##T(const T& b) { return b; }225 226CALL_CC(PackedMembers)227// PackedMembers copy-assignment:228// CHECK-LABEL: define linkonce_odr void @_ZN13PackedMembersC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)229// CHECK: call void @_ZN6NonPODC1ERKS_230// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 1 {{.*}} align 1 {{.*}}i64 16, i1 {{.*}})231// CHECK: ret void232 233CALL_CC(BitfieldMember2)234// BitfieldMember2 copy-constructor:235// CHECK-2-LABEL: define linkonce_odr void @_ZN15BitfieldMember2C2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)236// CHECK-2: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 false)237// CHECK-2: call void @_ZN6NonPODC1ERKS_238// CHECK-2: ret void239 240CALL_CC(BitfieldMember3)241// BitfieldMember3 copy-constructor:242// CHECK-LABEL: define linkonce_odr void @_ZN15BitfieldMember3C2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)243// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 8 {{.*}} align 8 {{.*}}i64 8, i1 false)244// CHECK: ret void245 246CALL_CC(ReferenceMember)247// ReferenceMember copy-constructor:248// CHECK-LABEL: define linkonce_odr void @_ZN15ReferenceMemberC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)249// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 8 {{.*}} align 8 {{.*}}i64 16, i1 {{.*}})250// CHECK: call void @_ZN6NonPODC1ERKS_251// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 8 {{.*}} align 8 {{.*}}i64 16, i1 {{.*}})252// CHECK: ret void253 254CALL_CC(InnerClassMember)255// InnerClass copy-constructor:256// CHECK-LABEL: define linkonce_odr void @_ZN16InnerClassMemberC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)257// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 32, i1 {{.*}})258// CHECK: call void @_ZN6NonPODC1ERKS_259// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})260// CHECK: ret void261 262CALL_CC(BitfieldMember)263// BitfieldMember copy-constructor:264// CHECK-LABEL: define linkonce_odr void @_ZN14BitfieldMemberC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)265// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})266// CHECK: call void @_ZN6NonPODC1ERKS_267// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 1 {{.*}} align 1 {{.*}}i64 3, i1 {{.*}})268// CHECK: ret void269 270CALL_CC(VolatileMember)271// VolatileMember copy-constructor:272// CHECK-LABEL: define linkonce_odr void @_ZN14VolatileMemberC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)273// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})274// CHECK: load volatile i32, ptr {{.*}}, align 4275// CHECK: store volatile i32 {{.*}}, align 4276// CHECK: call void @_ZN6NonPODC1ERKS_277// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})278// CHECK: ret void279 280CALL_CC(ArrayMember)281// ArrayMember copy-constructor:282// CHECK-LABEL: define linkonce_odr void @_ZN11ArrayMemberC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)283// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 64, i1 {{.*}})284// CHECK: call void @_ZN6NonPODC1ERKS_285// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 64, i1 {{.*}})286// CHECK: ret void287 288CALL_CC(PODLikeMember)289// PODLikeMember copy-constructor:290// CHECK-LABEL: define linkonce_odr void @_ZN13PODLikeMemberC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)291// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 32, i1 {{.*}})292// CHECK: invoke void @_ZN6NonPODC1ERKS_293// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})294// CHECK: ret void295// CHECK: landingpad296// CHECK: invoke void @_ZN7PODLikeD1Ev297 298CALL_CC(PODMember)299// PODMember copy-constructor:300// CHECK-LABEL: define linkonce_odr void @_ZN9PODMemberC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)301// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 32, i1 {{.*}})302// CHECK: call void @_ZN6NonPODC1ERKS_303// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})304// CHECK: ret void305 306CALL_CC(Basic)307// Basic copy-constructor:308// CHECK-LABEL: define linkonce_odr void @_ZN5BasicC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)309// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})310// CHECK: call void @_ZN6NonPODC1ERKS_311// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 16, i1 {{.*}})312// CHECK: ret void313 314CALL_CC(WithEmptyField)315// WithEmptyField copy-constructor:316// CHECK-LABEL: define linkonce_odr void @_ZN14WithEmptyFieldC2ERKS_317// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 4, i1 {{.*}})318// CHECK: call void @_ZN6NonPODC1ERKS_319 320CALL_CC(WithEmptyNUAField)321// WithEmptyNUAField copy-constructor:322// CHECK-LABEL: define linkonce_odr void @_ZN17WithEmptyNUAFieldC2ERKS_(ptr {{[^,]*}} %this, ptr nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) %0)323// CHECK: call void @llvm.memcpy.p0.p0.i64({{.*}} align 4 {{.*}} align 4 {{.*}}i64 4, i1 {{.*}})324// CHECK: call void @_ZN6NonPODC1ERKS_325