| // P0784R7 |
| // { dg-do compile { target c++20 } } |
| // { dg-additional-options "-fdelete-null-pointer-checks" } |
| |
| constexpr int * |
| f1 () |
| { |
| return new int (2); // { dg-error "is not a constant expression because it refers to a result of" } |
| } |
| |
| constexpr auto v1 = f1 (); |
| |
| constexpr bool |
| f2 () |
| { |
| int *p = new int (3); // { dg-error "is not a constant expression because allocated storage has not been deallocated" } |
| return false; |
| } |
| |
| constexpr auto v2 = f2 (); |
| |
| constexpr bool |
| f3 () |
| { |
| int *p = new int (3); |
| int *q = p; |
| delete p; |
| delete q; // { dg-error "deallocation of already deallocated storage" } |
| return false; |
| } |
| |
| constexpr auto v3 = f3 (); // { dg-message "in 'constexpr' expansion of" } |
| |
| constexpr bool |
| f4 (int *p) |
| { |
| delete p; // { dg-error "deallocation of storage that was not previously allocated" } |
| return false; |
| } |
| |
| int q; |
| constexpr auto v4 = f4 (&q); // { dg-message "in 'constexpr' expansion of" } |
| |
| constexpr bool |
| f5 () |
| { |
| int *p = new int; // { dg-message "allocated here" } |
| return *p == 1; |
| } |
| |
| constexpr auto v5 = f5 (); // { dg-error "the content of uninitialized storage is not usable in a constant expression" } |
| // { dg-message "in 'constexpr' expansion of" "" { target *-*-* } .-1 } |
| |
| constexpr bool |
| f6 () |
| { |
| int *p = new int (2); // { dg-message "allocated here" } |
| int *q = p; |
| delete p; |
| return *q == 2; |
| } |
| |
| constexpr auto v6 = f6 (); // { dg-error "use of allocated storage after deallocation in a constant expression" } |
| // { dg-message "in 'constexpr' expansion of" "" { target *-*-* } .-1 } |
| |
| constexpr int * |
| f7 () |
| { |
| int *p = new int (2); // { dg-error "is not a constant expression because it refers to a result of" } |
| delete p; |
| return p; |
| } |
| |
| constexpr auto v7 = f7 (); |