[clang] [LifetimeSafety] Add support for `new`/`delete` (PR #192504)
Utkarsh Saxena via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 19 10:48:38 PDT 2026
================
@@ -2663,6 +2663,213 @@ int *noreturn_dead_nested(bool cond, bool cond2, int *num) {
} // namespace conditional_operator_control_flow
+namespace heap_allocation {
+
+//===----------------------------------------------------------------------===//
+// new
+//===----------------------------------------------------------------------===//
+
+void new_view_from_dead_scope() {
+ View *p;
+ {
+ MyObj obj;
+ p = new View(obj); // expected-warning {{object whose reference is captured does not live long enough}}
+ } // expected-note {{destroyed here}}
+ p->use(); // expected-note {{later used here}}
+}
+
+void new_int_basic() {
+ int *p = new int; // expected-warning {{allocated object does not live long enough}}
+ delete p; // expected-note {{freed here}}
+ (void)*p; // expected-note {{later used here}}
+}
+
+void new_int_parens() {
+ int *p = new int(); // expected-warning {{allocated object does not live long enough}}
+ delete p; // expected-note {{freed here}}
+ (void)*p; // expected-note {{later used here}}
+}
+
+void new_int_braces() {
+ int *p = new int{}; // expected-warning {{allocated object does not live long enough}}
+ delete p; // expected-note {{freed here}}
+ (void)*p; // expected-note {{later used here}}
+}
+
+void conditional_delete(bool cond) {
+ int *p1 = new int; // expected-warning {{allocated object does not live long enough}}
+ int *p2 = new int;
+ delete (cond ? p1 : p2); // expected-note {{freed here}}
+ (void)*p1; // expected-note {{later used here}}
+}
+
+int* foo(int* x [[clang::lifetimebound]], int* y [[clang::lifetimebound]]);
+
+void delete_returned_from_call() {
+ int* x = new int(1); // expected-warning {{allocated object does not live long enough}}
+ int* y = new int(2); // expected-warning {{allocated object does not live long enough}}
+ delete foo(x, y); // expected-note 2 {{freed here}}
+ (void)x; // expected-note {{later used here}}
+ (void)y; // expected-note {{later used here}}
+}
+
+void new_pointer_from_pointer() {
+ MyObj **p;
+ {
+ MyObj obj;
+ MyObj *q = &obj; // expected-warning {{object whose reference is captured does not live long enough}}
+ p = new MyObj *(q);
+ } // expected-note {{destroyed here}}
+ (void)**p; // expected-note {{later used here}}
+}
+
+void new_pointer_from_dead_object() {
+ MyObj **p;
+ {
+ MyObj obj;
+ p = new MyObj *(&obj); // expected-warning {{object whose reference is captured does not live long enough}}
+ } // expected-note {{destroyed here}}
+ (void)**p; // expected-note {{later used here}}
+}
+
+struct MultiView {
+ MultiView(MyObj& a [[clang::lifetimebound]], MyObj& b [[clang::lifetimebound]]);
+};
+
+void new_multiview_from_mixed_scope() {
+ MyObj obj1;
+ MultiView *p;
+ {
+ MyObj obj2;
+ p = new MultiView(obj1, obj2); // expected-warning {{object whose reference is captured does not live long enough}}
+ } // expected-note {{destroyed here}}
+ (void)p; // expected-note {{later used here}}
----------------
usx95 wrote:
nit: match the indent with expected-warning
https://github.com/llvm/llvm-project/pull/192504
More information about the cfe-commits
mailing list