xref: /llvm-project/clang/test/Analysis/SpecialFunctionsCFError.cpp (revision 9b1e4a8218b7fcb8900d0382704fdb4e38b52eb0)
1*9b1e4a82SArtem Dergachev // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.coreFoundation.CFError \
2*9b1e4a82SArtem Dergachev // RUN:   -verify %s
3*9b1e4a82SArtem Dergachev 
4*9b1e4a82SArtem Dergachev typedef unsigned long size_t;
5*9b1e4a82SArtem Dergachev struct __CFError {};
6*9b1e4a82SArtem Dergachev typedef struct __CFError *CFErrorRef;
7*9b1e4a82SArtem Dergachev void *malloc(size_t);
8*9b1e4a82SArtem Dergachev 
9*9b1e4a82SArtem Dergachev class Foo {
10*9b1e4a82SArtem Dergachev public:
Foo(CFErrorRef * error)11*9b1e4a82SArtem Dergachev   Foo(CFErrorRef *error) {} // no-warning
12*9b1e4a82SArtem Dergachev 
operator delete(void * pointer,CFErrorRef * error)13*9b1e4a82SArtem Dergachev   void operator delete(void *pointer, CFErrorRef *error) { // no-warning
14*9b1e4a82SArtem Dergachev     return;
15*9b1e4a82SArtem Dergachev   }
16*9b1e4a82SArtem Dergachev 
operator delete[](void * pointer,CFErrorRef * error)17*9b1e4a82SArtem Dergachev   void operator delete[](void *pointer, CFErrorRef *error) { // no-warning
18*9b1e4a82SArtem Dergachev     return;
19*9b1e4a82SArtem Dergachev   }
20*9b1e4a82SArtem Dergachev 
21*9b1e4a82SArtem Dergachev   // Check that we report warnings for operators when it can be useful
operator ()(CFErrorRef * error)22*9b1e4a82SArtem Dergachev   void operator()(CFErrorRef *error) {} // expected-warning {{Function accepting CFErrorRef* should have a non-void return value to indicate whether or not an error occurred}}
23*9b1e4a82SArtem Dergachev };
24*9b1e4a82SArtem Dergachev 
25*9b1e4a82SArtem Dergachev // Check that global delete operator is not bothered as well
operator delete(void * pointer,CFErrorRef * error)26*9b1e4a82SArtem Dergachev void operator delete(void *pointer, CFErrorRef *error) { // no-warning
27*9b1e4a82SArtem Dergachev   return;
28*9b1e4a82SArtem Dergachev }
29