mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-01 10:46:07 +00:00

Objective-C related to NSException. Fixes <rdar://problem/12287498> I debated whether or not this logic should be sunk into the CFG itself. It's not clear if we should, as different analyses may wish to have different policies. We can re-evaluate this in the future. llvm-svn: 163760
57 lines
1.4 KiB
Objective-C
57 lines
1.4 KiB
Objective-C
// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only -fblocks %s -verify
|
|
|
|
#include <stdarg.h>
|
|
|
|
@interface NSObject {} @end
|
|
@class NSString;
|
|
|
|
@interface NSException
|
|
+ (void)raise:(NSString *)name format:(NSString *)format, ...;
|
|
+ (void)raise:(NSString *)name format:(NSString *)format arguments:(va_list)argList;
|
|
- (void)raise;
|
|
@end
|
|
|
|
// Duplicated from uninit-variables.c.
|
|
// Test just to ensure the analysis is working.
|
|
int test1() {
|
|
int x; // expected-note{{initialize the variable 'x' to silence this warning}}
|
|
return x; // expected-warning{{variable 'x' is uninitialized when used here}}
|
|
}
|
|
|
|
// Test ObjC fast enumeration.
|
|
void test2() {
|
|
id collection = 0;
|
|
for (id obj in collection) {
|
|
if (0 == obj) // no-warning
|
|
break;
|
|
}
|
|
}
|
|
|
|
void test3() {
|
|
id collection = 0;
|
|
id obj;
|
|
for (obj in collection) { // no-warning
|
|
if (0 == obj) // no-warning
|
|
break;
|
|
}
|
|
}
|
|
|
|
int test_abort_on_exceptions(int y, NSException *e, NSString *s, int *z, ...) {
|
|
int x; // expected-note {{initialize the variable 'x' to silence this warning}}
|
|
if (y == 1) {
|
|
va_list alist;
|
|
va_start(alist, z);
|
|
[NSException raise:@"Blah" format:@"Blah %@" arguments:alist];
|
|
return x;
|
|
}
|
|
else if (y == 2) {
|
|
[NSException raise:@"Blah" format:s];
|
|
return x;
|
|
}
|
|
else if (y == 3) {
|
|
[e raise];
|
|
return x;
|
|
}
|
|
return x; // expected-warning {{variable 'x' is uninitialized when used here}}
|
|
}
|