@@ -12,13 +12,28 @@ struct Parrot : public Bird {
1212
1313Bird::~Bird () {}
1414
15+ // For the weird bird we first emit scalar deleting destructor, then find out
16+ // that we need vector deleting destructor and remove the alias.
17+ struct JustAWeirdBird {
18+ virtual ~JustAWeirdBird () {}
19+
20+ bool doSmth (int n) {
21+ JustAWeirdBird *c = new JustAWeirdBird[n];
22+
23+ delete[] c;
24+ return true ;
25+ }
26+ };
27+
1528// Vector deleting dtor for Bird is an alias because no new Bird[] expressions
1629// in the TU.
1730// CHECK: @"??_EBird@@UEAAPEAXI@Z" = weak dso_local unnamed_addr alias ptr (ptr, i32), ptr @"??_GBird@@UEAAPEAXI@Z"
1831// No scalar destructor for Parrot.
1932// CHECK-NOT: @"??_GParrot"
2033// No vector destructor definition for Bird.
2134// CHECK-NOT: define{{.*}}@"??_EBird"
35+ // No scalar deleting dtor for JustAWeirdBird.
36+ // CHECK-NOT: @"??_GJustAWeirdBird"
2237
2338void dealloc (Bird *p) {
2439 delete[] p;
@@ -31,6 +46,9 @@ Bird* alloc() {
3146
3247void bar () {
3348 dealloc (alloc ());
49+
50+ JustAWeirdBird B;
51+ B.doSmth (38 );
3452}
3553
3654// CHECK-LABEL: define dso_local void @{{.*}}dealloc{{.*}}(
@@ -101,8 +119,11 @@ void bar() {
101119// CHECK-NEXT: %[[ISFIRSTBITZERO:.*]] = icmp eq i32 %[[FIRSTBIT]], 0
102120// CHECK-NEXT: br i1 %[[ISFIRSTBITZERO]], label %dtor.continue, label %dtor.call_delete
103121// CHECK: dtor.call_delete:
104- // CHECK-NEXT: call void @"??3@YAXPEAX_K@Z"(ptr noundef %[[LTHIS]], i64 noundef 8) #3
122+ // CHECK-NEXT: call void @"??3@YAXPEAX_K@Z"(ptr noundef %[[LTHIS]], i64 noundef 8)
105123// CHECK-NEXT: br label %dtor.continue
106124// CHECK: dtor.continue:
107125// CHECK-NEXT: %[[LOADRET:.*]] = load ptr, ptr %[[RET]], align 8
108126// CHECK-NEXT: ret ptr %[[LOADRET]]
127+
128+ // CHECK: define weak dso_local ptr @"??_EJustAWeirdBird@@UEAAPEAXI@Z"(
129+ // CHECK-SAME: ptr %this, i32 %should_call_delete)
0 commit comments