NoQ created this revision. NoQ added reviewers: dcoughlin, xazax.hun, a.sidorin, george.karpenkov, szepet. Herald added subscribers: cfe-commits, rnkovacs.
Fun C++ fact: definition void *operator new(std::size_t size, std::nothrow_t ¬hrow) throw() { ... } does not override the global nothrow operator new. The standard nothrow operator new would still be called when this definition is present. Because, well, the second parameter (`std::nothrow_t ¬hrow`) is missing a `const` qualifier, so it's a completely different function. In fact, temporary of type `std::nothrow_t` would never be bound to a non-const reference at all. So the custom operator defined above is also very hard to call. This patch fixes the test case. The analyzer behavior is intended (at least for now, see also discussion in https://reviews.llvm.org/D41406) regardless of whether the operator is overridden correctly or not, but tests now actually test it. Repository: rC Clang https://reviews.llvm.org/D41408 Files: test/Analysis/NewDelete-custom.cpp Index: test/Analysis/NewDelete-custom.cpp =================================================================== --- test/Analysis/NewDelete-custom.cpp +++ test/Analysis/NewDelete-custom.cpp @@ -4,16 +4,16 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks,unix.Malloc -std=c++11 -analyzer-config c++-allocator-inlining=true -DLEAKS=1 -DALLOCATOR_INLINING=1 -fblocks -verify %s #include "Inputs/system-header-simulator-cxx.h" -#if !LEAKS +#if !(LEAKS && !ALLOCATOR_INLINING) // expected-no-diagnostics #endif void *allocator(std::size_t size); void *operator new[](std::size_t size) throw() { return allocator(size); } void *operator new(std::size_t size) throw() { return allocator(size); } -void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); } +void *operator new(std::size_t size, const std::nothrow_t ¬hrow) throw() { return allocator(size); } void *operator new(std::size_t, double d); class C { @@ -59,16 +59,13 @@ //----- Custom NoThrow placement operators void testOpNewNoThrow() { - void *p = operator new(0, std::nothrow); + void *p = operator new(0, std::nothrow); // call is inlined, no warn } -#if LEAKS -// expected-warning@-2{{Potential leak of memory pointed to by 'p'}} -#endif void testNewExprNoThrow() { int *p = new(std::nothrow) int; } -#if LEAKS +#if LEAKS && !ALLOCATOR_INLINING // expected-warning@-2{{Potential leak of memory pointed to by 'p'}} #endif
Index: test/Analysis/NewDelete-custom.cpp =================================================================== --- test/Analysis/NewDelete-custom.cpp +++ test/Analysis/NewDelete-custom.cpp @@ -4,16 +4,16 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=core,cplusplus.NewDelete,cplusplus.NewDeleteLeaks,unix.Malloc -std=c++11 -analyzer-config c++-allocator-inlining=true -DLEAKS=1 -DALLOCATOR_INLINING=1 -fblocks -verify %s #include "Inputs/system-header-simulator-cxx.h" -#if !LEAKS +#if !(LEAKS && !ALLOCATOR_INLINING) // expected-no-diagnostics #endif void *allocator(std::size_t size); void *operator new[](std::size_t size) throw() { return allocator(size); } void *operator new(std::size_t size) throw() { return allocator(size); } -void *operator new(std::size_t size, std::nothrow_t& nothrow) throw() { return allocator(size); } +void *operator new(std::size_t size, const std::nothrow_t ¬hrow) throw() { return allocator(size); } void *operator new(std::size_t, double d); class C { @@ -59,16 +59,13 @@ //----- Custom NoThrow placement operators void testOpNewNoThrow() { - void *p = operator new(0, std::nothrow); + void *p = operator new(0, std::nothrow); // call is inlined, no warn } -#if LEAKS -// expected-warning@-2{{Potential leak of memory pointed to by 'p'}} -#endif void testNewExprNoThrow() { int *p = new(std::nothrow) int; } -#if LEAKS +#if LEAKS && !ALLOCATOR_INLINING // expected-warning@-2{{Potential leak of memory pointed to by 'p'}} #endif
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits