https://github.com/ankit-cybertron updated https://github.com/llvm/llvm-project/pull/213455
>From b09136141651917ef6f3531a15929aa8a44cb25c Mon Sep 17 00:00:00 2001 From: Ankit Kumar Tiwari <[email protected]> Date: Sat, 1 Aug 2026 20:24:16 +0530 Subject: [PATCH 1/2] [Clang] Skip type-aware delete resolution for incomplete types + test --- clang/lib/Sema/SemaExprCXX.cpp | 15 ++++++---- .../type-aware-delete-incomplete-type.cpp | 30 +++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 538604aa2e64b..e8e109d40ced8 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -4149,10 +4149,15 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, DeclarationName DeleteName = Context.DeclarationNames.getCXXOperatorName( ArrayForm ? OO_Array_Delete : OO_Delete); + bool IsComplete = isCompleteType(StartLoc, Pointee); + TypeAwareAllocationMode PassTypeIdentity = + IsComplete ? ShouldUseTypeAwareOperatorNewOrDelete() + : TypeAwareAllocationMode::No; + if (PointeeRD) { - ImplicitDeallocationParameters IDP = { - Pointee, ShouldUseTypeAwareOperatorNewOrDelete(), - AlignedAllocationMode::No, SizedDeallocationMode::No}; + ImplicitDeallocationParameters IDP = {Pointee, PassTypeIdentity, + AlignedAllocationMode::No, + SizedDeallocationMode::No}; if (!UseGlobal && FindDeallocationFunction(StartLoc, PointeeRD, DeleteName, OperatorDelete, IDP)) @@ -4199,7 +4204,6 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, return ExprError(); } - bool IsComplete = isCompleteType(StartLoc, Pointee); bool CanProvideSize = IsComplete && (!ArrayForm || UsualArrayDeleteWantsSize || Pointee.isDestructedType()); @@ -4207,8 +4211,7 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, // Look for a global declaration. ImplicitDeallocationParameters IDP = { - Pointee, ShouldUseTypeAwareOperatorNewOrDelete(), - alignedAllocationModeFromBool(Overaligned), + Pointee, PassTypeIdentity, alignedAllocationModeFromBool(Overaligned), sizedDeallocationModeFromBool(CanProvideSize)}; OperatorDelete = FindUsualDeallocationFunction(StartLoc, IDP, DeleteName); if (!OperatorDelete) diff --git a/clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp b/clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp new file mode 100644 index 0000000000000..2eb74beaec8d0 --- /dev/null +++ b/clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify=warn %s +// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify=warn %s +// RUN: %clang_cc1 -std=c++26 -fsyntax-only -verify=err %s +// RUN: %clang_cc1 -std=c++17 -emit-llvm -o - %s | FileCheck %s + +class Foo; // warn-note {{forward declaration of 'Foo'}} \ + // err-note {{forward declaration of 'Foo'}} + +typedef __SIZE_TYPE__ size_t; + +namespace std { + enum class align_val_t : size_t {}; + template <class T> struct type_identity { + typedef T type; + }; +} + +template <class T> +void operator delete(std::type_identity<T>, void *, size_t, std::align_val_t); // warn-warning {{type aware allocators are a Clang extension}} \ + // err-warning {{type aware allocators are a Clang extension}} + +void f(Foo *o) { + delete o; + // warn-warning@-1 {{deleting pointer to incomplete type 'Foo' is incompatible with C++2c and may cause undefined behavior}} + // err-error@-2 {{cannot delete pointer to incomplete type 'Foo'}} +} + +// CHECK-LABEL: define {{.*}} @_Z1fP3Foo +// CHECK-NOT: call {{.*}} @{{.*}}operator delete{{.*}}type_identity +// CHECK: call void @_ZdlPv \ No newline at end of file >From 8895993e2023881aee12f91e2336e3a9a04b7218 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Tiwari <[email protected]> Date: Mon, 3 Aug 2026 00:33:16 +0530 Subject: [PATCH 2/2] Add warning when dropping type-aware delete for incomplete types --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 ++++ clang/lib/Sema/SemaExprCXX.cpp | 7 +++++-- clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp | 8 +++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index cce6f70a58893..e45a5e4c4cb08 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10444,6 +10444,10 @@ def err_destroying_operator_delete_not_usual : Error< def err_type_aware_destroying_operator_delete : Error< "destroying delete is not permitted to be type aware">; +def warn_type_aware_delete_incomplete : Warning< + "type-aware deallocation is not used for deletion of " + "pointer to incomplete type %0">, + InGroup<DeleteIncomplete>; def warn_ext_type_aware_allocators : ExtWarn< "type aware allocators are a Clang extension">, InGroup<DiagGroup<"ext-cxx-type-aware-allocators">>; def err_type_aware_allocator_missing_matching_operator : Error< diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index e8e109d40ced8..54bd27ff853d1 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -4151,8 +4151,11 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool IsComplete = isCompleteType(StartLoc, Pointee); TypeAwareAllocationMode PassTypeIdentity = - IsComplete ? ShouldUseTypeAwareOperatorNewOrDelete() - : TypeAwareAllocationMode::No; + ShouldUseTypeAwareOperatorNewOrDelete(); + if (!IsComplete && isTypeAwareAllocation(PassTypeIdentity)) { + Diag(StartLoc, diag::warn_type_aware_delete_incomplete) << Pointee; + PassTypeIdentity = TypeAwareAllocationMode::No; + } if (PointeeRD) { ImplicitDeallocationParameters IDP = {Pointee, PassTypeIdentity, diff --git a/clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp b/clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp index 2eb74beaec8d0..610fd8a81a74b 100644 --- a/clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp +++ b/clang/test/SemaCXX/type-aware-delete-incomplete-type.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify=warn %s // RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify=warn %s // RUN: %clang_cc1 -std=c++26 -fsyntax-only -verify=err %s -// RUN: %clang_cc1 -std=c++17 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s class Foo; // warn-note {{forward declaration of 'Foo'}} \ // err-note {{forward declaration of 'Foo'}} @@ -21,8 +21,10 @@ void operator delete(std::type_identity<T>, void *, size_t, std::align_val_t); / void f(Foo *o) { delete o; - // warn-warning@-1 {{deleting pointer to incomplete type 'Foo' is incompatible with C++2c and may cause undefined behavior}} - // err-error@-2 {{cannot delete pointer to incomplete type 'Foo'}} + // warn-warning@-1 {{type-aware deallocation is not used for deletion of pointer to incomplete type 'Foo'}} + // warn-warning@-2 {{deleting pointer to incomplete type 'Foo' is incompatible with C++2c and may cause undefined behavior}} + // err-warning@-3 {{type-aware deallocation is not used for deletion of pointer to incomplete type 'Foo'}} + // err-error@-4 {{cannot delete pointer to incomplete type 'Foo'}} } // CHECK-LABEL: define {{.*}} @_Z1fP3Foo _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
