diff options
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/misc-new-delete-overloads.cpp')
| -rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-new-delete-overloads.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/clang-tools-extra/test/clang-tidy/misc-new-delete-overloads.cpp b/clang-tools-extra/test/clang-tidy/misc-new-delete-overloads.cpp new file mode 100644 index 00000000000..6bb73c7c433 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/misc-new-delete-overloads.cpp @@ -0,0 +1,75 @@ +// RUN: %python %S/check_clang_tidy.py %s misc-new-delete-overloads %t -- -std=c++14 + +struct S { + // CHECK-MESSAGES: :[[@LINE+1]]:9: warning: declaration of 'operator new' has no matching declaration of 'operator delete' at the same scope [misc-new-delete-overloads] + void *operator new(size_t size) noexcept; + // CHECK-MESSAGES: :[[@LINE+1]]:9: warning: declaration of 'operator new[]' has no matching declaration of 'operator delete[]' at the same scope + void *operator new[](size_t size) noexcept; +}; + +// CHECK-MESSAGES: :[[@LINE+1]]:7: warning: declaration of 'operator new' has no matching declaration of 'operator delete' at the same scope +void *operator new(size_t size) noexcept; + +struct T { + // Sized deallocations are not enabled by default, and so this new/delete pair + // does not match. However, we expect only one warning, for the new, because + // the operator delete is a placement delete and we do not warn on mismatching + // placement operations. + // CHECK-MESSAGES: :[[@LINE+1]]:9: warning: declaration of 'operator new' has no matching declaration of 'operator delete' at the same scope + void *operator new(size_t size) noexcept; + void operator delete(void *ptr, size_t) noexcept; // ok only if sized deallocation is enabled +}; + +struct U { + void *operator new(size_t size) noexcept; + void operator delete(void *ptr) noexcept; + + void *operator new[](size_t) noexcept; + void operator delete[](void *) noexcept; +}; + +struct Z { + // CHECK-MESSAGES: :[[@LINE+1]]:8: warning: declaration of 'operator delete' has no matching declaration of 'operator new' at the same scope + void operator delete(void *ptr) noexcept; + // CHECK-MESSAGES: :[[@LINE+1]]:8: warning: declaration of 'operator delete[]' has no matching declaration of 'operator new[]' at the same scope + void operator delete[](void *ptr) noexcept; +}; + +struct A { + void *operator new(size_t size, Z) noexcept; // ok, placement new +}; + +struct B { + void operator delete(void *ptr, A) noexcept; // ok, placement delete +}; + +// It is okay to have a class with an inaccessible free store operator. +struct C { + void *operator new(size_t, A) noexcept; // ok, placement new +private: + void operator delete(void *) noexcept; +}; + +// It is also okay to have a class with a delete free store operator. +struct D { + void *operator new(size_t, A) noexcept; // ok, placement new + void operator delete(void *) noexcept = delete; +}; + +struct E : U { + void *operator new(size_t) noexcept; // okay, we inherit operator delete from U +}; + +struct F : S { + // CHECK-MESSAGES: :[[@LINE+1]]:9: warning: declaration of 'operator new' has no matching declaration of 'operator delete' at the same scope + void *operator new(size_t) noexcept; +}; + +class G { + void operator delete(void *) noexcept; +}; + +struct H : G { + // CHECK-MESSAGES: :[[@LINE+1]]:9: warning: declaration of 'operator new' has no matching declaration of 'operator delete' at the same scope + void *operator new(size_t) noexcept; // base class operator is inaccessible +}; |

