Skip to content

Commit 460d480

Browse files
committed
Revert "[MS][clang] Error about ambiguous operator delete[] only when required (llvm#135041)"
This reverts commit 2b3aa56.
1 parent 51fe5d2 commit 460d480

File tree

3 files changed

+14
-74
lines changed

3 files changed

+14
-74
lines changed

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11097,23 +11097,15 @@ bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) {
1109711097
DiagnoseUseOfDecl(OperatorDelete, Loc);
1109811098
MarkFunctionReferenced(Loc, OperatorDelete);
1109911099
Destructor->setOperatorDelete(OperatorDelete, ThisArg);
11100-
if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
11101-
// Lookup delete[] too in case we have to emit a vector deleting dtor;
11102-
DeclarationName VDeleteName =
11103-
Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11104-
// Diagnose if there is no available operator delete[] found and the
11105-
// destructor is exported. Vector deleting dtor body emission requires
11106-
// operator delete[] to be present. Whenever the destructor is exported,
11107-
// we just always emit vector deleting dtor body, because we don't know
11108-
// if new[] will be used with the type outside of the library. Otherwise
11109-
// when the dtor is not exported then new[]/delete[] in the TU will make
11110-
// sure the operator is referenced and its uses diagnosed.
11111-
bool Diagnose =
11112-
Destructor->hasAttr<DLLExportAttr>() && Destructor->isDefined();
11113-
FunctionDecl *ArrOperatorDelete = FindDeallocationFunctionForDestructor(
11114-
Loc, RD, VDeleteName, Diagnose);
11115-
Destructor->setOperatorArrayDelete(ArrOperatorDelete);
11116-
}
11100+
// Lookup delete[] too in case we have to emit a vector deleting dtor;
11101+
DeclarationName VDeleteName =
11102+
Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11103+
FunctionDecl *ArrOperatorDelete = FindDeallocationFunctionForDestructor(
11104+
Loc, RD, VDeleteName, /*Diagnose=*/false);
11105+
// delete[] in the TU will make sure the operator is referenced and its
11106+
// uses diagnosed, otherwise vector deleting dtor won't be called anyway,
11107+
// so just record it in the destructor.
11108+
Destructor->setOperatorArrayDelete(ArrOperatorDelete);
1111711109
}
1111811110
}
1111911111

clang/lib/Sema/SemaExprCXX.cpp

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,19 +3016,8 @@ bool Sema::FindAllocationFunctions(
30163016
return true;
30173017
}
30183018

3019-
// new[] will force emission of vector deleting dtor which needs delete[].
3020-
bool MaybeVectorDeletingDtor = false;
3021-
if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
3022-
if (AllocElemType->isRecordType() && IsArray) {
3023-
auto *RD =
3024-
cast<CXXRecordDecl>(AllocElemType->castAs<RecordType>()->getDecl());
3025-
CXXDestructorDecl *DD = RD->getDestructor();
3026-
MaybeVectorDeletingDtor = DD && DD->isVirtual() && !DD->isDeleted();
3027-
}
3028-
}
3029-
30303019
// We don't need an operator delete if we're running under -fno-exceptions.
3031-
if (!getLangOpts().Exceptions && !MaybeVectorDeletingDtor) {
3020+
if (!getLangOpts().Exceptions) {
30323021
OperatorDelete = nullptr;
30333022
return false;
30343023
}
@@ -3619,11 +3608,8 @@ bool Sema::FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD,
36193608
// Try to find operator delete/operator delete[] in class scope.
36203609
LookupQualifiedName(Found, RD);
36213610

3622-
if (Found.isAmbiguous()) {
3623-
if (!Diagnose)
3624-
Found.suppressDiagnostics();
3611+
if (Found.isAmbiguous())
36253612
return true;
3626-
}
36273613

36283614
Found.suppressDiagnostics();
36293615

clang/test/SemaCXX/gh134265.cpp

Lines changed: 3 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
// RUN: %clang_cc1 %s -verify=expected -fsyntax-only -triple=x86_64-unknown-linux-gnu
2-
// RUN: %clang_cc1 %s -verify=expected -fsyntax-only -triple=x86_64-unknown-linux-gnu -std=c++20
3-
// RUN: %clang_cc1 %s -verify=expected,ms -fms-extensions -fms-compatibility -triple=x86_64-pc-windows-msvc -DMS
1+
// RUN: %clang_cc1 %s -verify -fsyntax-only
42

53
struct Foo {
64
virtual ~Foo() {} // expected-error {{attempt to use a deleted function}}
@@ -15,46 +13,10 @@ struct Bar {
1513

1614
struct Baz {
1715
virtual ~Baz() {}
18-
static void operator delete[](void* ptr) = delete; // expected-note {{explicitly marked deleted here}}\
19-
ms-note{{explicitly marked deleted here}}}
20-
};
21-
22-
struct BarBaz {
23-
~BarBaz() {}
24-
static void operator delete[](void* ptr) = delete;
16+
static void operator delete[](void* ptr) = delete; // expected-note {{explicitly marked deleted here}}
2517
};
2618

2719
void foobar() {
28-
Baz *B = new Baz[10](); // ms-error {{attempt to use a deleted function}}
20+
Baz *B = new Baz[10]();
2921
delete [] B; // expected-error {{attempt to use a deleted function}}
30-
BarBaz *BB = new BarBaz[10]();
31-
}
32-
33-
struct BaseDelete1 {
34-
void operator delete[](void *); //ms-note 3{{member found by ambiguous name lookup}}
35-
};
36-
struct BaseDelete2 {
37-
void operator delete[](void *); //ms-note 3{{member found by ambiguous name lookup}}
38-
};
39-
struct BaseDestructor {
40-
BaseDestructor() {}
41-
virtual ~BaseDestructor() = default;
42-
};
43-
struct Final : BaseDelete1, BaseDelete2, BaseDestructor {
44-
Final() {}
45-
};
46-
struct FinalExplicit : BaseDelete1, BaseDelete2, BaseDestructor {
47-
FinalExplicit() {}
48-
inline ~FinalExplicit() {}
49-
};
50-
51-
#ifdef MS
52-
struct Final1 : BaseDelete1, BaseDelete2, BaseDestructor {
53-
__declspec(dllexport) ~Final1() {} // ms-error {{member 'operator delete[]' found in multiple base classes of different types}}
54-
};
55-
#endif // MS
56-
57-
void foo() {
58-
Final* a = new Final[10](); // ms-error {{member 'operator delete[]' found in multiple base classes of different types}}
59-
FinalExplicit* b = new FinalExplicit[10](); // ms-error {{member 'operator delete[]' found in multiple base classes of different types}}
6022
}

0 commit comments

Comments
 (0)