From c12b43ab249ade0bab324560bc2f70cefc6f3ec1 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Sat, 7 Dec 2013 23:53:50 +0000 Subject: Merging r196488: ------------------------------------------------------------------------ r196488 | rsmith | 2013-12-05 00:30:59 -0800 (Thu, 05 Dec 2013) | 4 lines PR17983: Fix crasher bug in C++1y mode when performing a non-global array delete on a class which has no array cookie and has no class-specific operator new. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_34@196670 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclCXX.cpp | 4 ++++ lib/Sema/SemaExprCXX.cpp | 5 ++-- test/CodeGenCXX/cxx1y-sized-deallocation.cpp | 36 +++++++++++++++++++++------- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 9dff0f39c5..6b3400adac 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -6175,6 +6175,10 @@ bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) { Context.DeclarationNames.getCXXOperatorName(OO_Delete); if (FindDeallocationFunction(Loc, RD, Name, OperatorDelete)) return true; + // If there's no class-specific operator delete, look up the global + // non-array delete. + if (!OperatorDelete) + OperatorDelete = FindUsualDeallocationFunction(Loc, true, Name); MarkFunctionReferenced(Loc, OperatorDelete); diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index eb798d1ffa..07e465766b 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -2206,8 +2206,7 @@ bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, return true; } - // Look for a global declaration. - Operator = FindUsualDeallocationFunction(StartLoc, true, Name); + Operator = 0; return false; } @@ -2357,7 +2356,7 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, // Otherwise, the usual operator delete[] should be the // function we just found. - else if (isa(OperatorDelete)) + else if (OperatorDelete && isa(OperatorDelete)) UsualArrayDeleteWantsSize = (OperatorDelete->getNumParams() == 2); } diff --git a/test/CodeGenCXX/cxx1y-sized-deallocation.cpp b/test/CodeGenCXX/cxx1y-sized-deallocation.cpp index 642e1e07f6..7fd3ece3e0 100644 --- a/test/CodeGenCXX/cxx1y-sized-deallocation.cpp +++ b/test/CodeGenCXX/cxx1y-sized-deallocation.cpp @@ -30,6 +30,8 @@ template void del() { ::delete get(); ::delete[] get(); + delete get(); + delete[] get(); } template void del(); @@ -44,6 +46,9 @@ D::D() {} // CHECK-LABEL: define weak_odr void @_Z3delIiEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) +// +// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) +// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) // CHECK-LABEL: define linkonce void @_ZdlPvm(i8* // CHECK: call void @_ZdlPv(i8* %0) @@ -51,12 +56,20 @@ D::D() {} // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) +// +// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) +// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) // CHECK-LABEL: define weak_odr void @_Z3delI1CEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) // CHECK: mul i64 1, %{{[^ ]*}} // CHECK: add i64 %{{[^ ]*}}, 8 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) +// +// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) +// CHECK: mul i64 1, %{{[^ ]*}} +// CHECK: add i64 %{{[^ ]*}}, 8 +// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) // CHECK-LABEL: define linkonce void @_ZdaPvm(i8* // CHECK: call void @_ZdaPv(i8* %0) @@ -66,25 +79,32 @@ D::D() {} // CHECK: mul i64 8, %{{[^ ]*}} // CHECK: add i64 %{{[^ ]*}}, 8 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) +// +// CHECK-NOT: Zdl +// CHECK: call void %{{.*}} +// CHECK-NOT: Zdl +// CHECK: mul i64 8, %{{[^ ]*}} +// CHECK: add i64 %{{[^ ]*}}, 8 +// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) // CHECK-LABEL: define weak_odr void @_Z3delI1EEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) +// +// CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}}) +// CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}}) // CHECK-LABEL: define weak_odr void @_Z3delI1FEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) // CHECK: mul i64 1, %{{[^ ]*}} // CHECK: add i64 %{{[^ ]*}}, 8 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) +// +// CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1) +// CHECK: mul i64 1, %{{[^ ]*}} +// CHECK: add i64 %{{[^ ]*}}, 8 +// CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) -// CHECK-LABEL: define void @_Z10member_delv() -// CHECK-NOT: Zdl -// CHECK: call void %{{[^ ]*}}(%{{[^ ]*}}* % -// CHECK-NOT: Zdl -// CHECK: } -void member_del() { - delete get(); -} // CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this) // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8) -- cgit v1.2.3