30 lines
551 B
Plaintext
30 lines
551 B
Plaintext
|
// RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker core,cplusplus -verify %s
|
||
|
|
||
|
// expected-no-diagnostics
|
||
|
|
||
|
#define nil ((id)0)
|
||
|
|
||
|
// Stripped down unique_ptr<int>
|
||
|
struct IntPtr {
|
||
|
IntPtr(): i(new int) {}
|
||
|
IntPtr(IntPtr &&o): i(o.i) { o.i = nullptr; }
|
||
|
~IntPtr() { delete i; }
|
||
|
|
||
|
int *i;
|
||
|
};
|
||
|
|
||
|
@interface Foo {}
|
||
|
-(void) foo: (IntPtr)arg;
|
||
|
@end
|
||
|
|
||
|
void testArgumentRegionInvalidation(Foo *f) {
|
||
|
IntPtr ptr;
|
||
|
int *i = ptr.i;
|
||
|
[f foo: static_cast<IntPtr &&>(ptr)];
|
||
|
*i = 99; // no-warning
|
||
|
}
|
||
|
|
||
|
void testNilReceiverCleanup() {
|
||
|
[nil foo: IntPtr()];
|
||
|
}
|