[clang] [alpha.webkit.NoDeleteChecker] Allow no-delete default constructors (PR #201544)
Balázs Benics via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 4 04:20:36 PDT 2026
================
@@ -701,3 +701,45 @@ Ref<RefCountable> [[clang::annotate_type("webkit.nodelete")]] returnTypedefPrval
} // namespace returned_prvalue_typedef
+namespace create_with_default_constructor {
+
+ struct ObjectWithDefaultConstructorWithoutMemberVariables {
+ void ref() const;
+ void deref() const;
+
+ static auto [[clang::annotate_type("webkit.nodelete")]] create() {
+ return adoptRef(*new ObjectWithDefaultConstructorWithoutMemberVariables());
+ }
+ };
+
+ struct ObjectWithDefaultConstructorWithPODMemberVariables {
+ void ref() const;
+ void deref() const;
+
+ static auto [[clang::annotate_type("webkit.nodelete")]] create() {
+ return adoptRef(*new ObjectWithDefaultConstructorWithPODMemberVariables());
+ }
+
+ private:
+ int value { 0 };
+ RefCountable* ptr { nullptr };
+ };
+
+ struct ObjectWithOpaqueCtor {
+ ObjectWithOpaqueCtor();
+ };
+
+ struct ObjectWithDefaultConstructorWithOpaqueCtorMemberVariables {
+ void ref() const;
+ void deref() const;
+
+ static auto [[clang::annotate_type("webkit.nodelete")]] create() {
+ return adoptRef(*new ObjectWithDefaultConstructorWithOpaqueCtorMemberVariables());
+ // expected-warning at -1{{A function 'create' has [[clang::annotate_type("webkit.nodelete")]] but it contains code that could destruct an object}}
+ }
+
+ private:
+ ObjectWithOpaqueCtor obj;
+ };
+
+} // namespace create_with_default_constructor
----------------
steakhal wrote:
One thing that comes in my mind:
`adoptRef` returns a `Ref` via RVO - or at least that's what I think we intended to write.
So no Ref dtor should run when returning from `create`. And I think the bug is that we still assume that leaving `create` invokes the dtor of the moved-from Ref object because for some reason we think that the RVO couldn't happen and we opted for an implicit move.
And implicit moves leave the empty objects to be destructed, and call their dtors.
https://github.com/llvm/llvm-project/pull/201544
More information about the cfe-commits
mailing list