// RUN: %clang_analyze_cc1 -fobjc-arc -analyzer-checker=core,debug.ExprInspection -verify %s

void clang_analyzer_eval(int);
void clang_analyzer_warnIfReached();

extern void __assert_fail (__const char *__assertion, __const char *__file,
    unsigned int __line, __const char *__function)
     __attribute__ ((__noreturn__));

#define assert(expr) \
  ((expr)  ? (void)(0)  : __assert_fail (#expr, __FILE__, __LINE__, __func__))


@protocol NSObject
+ (nonnull instancetype)alloc;
- (nonnull instancetype)init;
@end
@interface NSObject <NSObject> {}
@end

@interface NSError : NSObject {
@public
  int x;
}
@end


@interface SomeClass : NSObject
+ (int)doSomethingWithError:(NSError *__autoreleasing *)error;
@end

@implementation SomeClass
+ (int)doSomethingWithError:(NSError *__autoreleasing *)error {
    if (error) {
        NSError *e = [[NSError alloc] init];
        assert(e);
        e->x = 5;
        *error = e;
        clang_analyzer_eval(*error != 0); // expected-warning{{TRUE}}
    }
    return 0;
}
@end

void testStrongOutParam(void) {
  NSError *error;
  clang_analyzer_eval(error != 0); // expected-warning{{FALSE}}
  int ok = [SomeClass doSomethingWithError:&error];
  clang_analyzer_eval(ok);         // expected-warning{{FALSE}}
  clang_analyzer_eval(error != 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(error->x == 5); // expected-warning{{TRUE}}
}

void testAutoreleasingOutParam(void) {
  NSError *__autoreleasing error;
  clang_analyzer_eval(error != 0); // expected-warning{{FALSE}}
  int ok = [SomeClass doSomethingWithError:&error];
  clang_analyzer_eval(ok);         // expected-warning{{FALSE}}
  clang_analyzer_eval(error != 0); // expected-warning{{TRUE}}
  clang_analyzer_eval(error->x == 5); // expected-warning{{TRUE}}
}

void testNilOutParam(void) {
    int ok = [SomeClass doSomethingWithError:(void *)0];
    clang_analyzer_eval(ok);  // expected-warning{{FALSE}}
}

