Я ожидаю, что следующий код выдаст предупреждения о неявном объявлении функций:
@interface TestClass : NSObject
@end
@implementation TestClass
- (void)foo {
NSString *test = [self bar];
NSLog(@"%@", test);
test = baz();
NSLog(@"%@", test);
}
- (NSString *)bar {
return @"bar";
}
NSString *baz() {
return @"baz";
}
@end
В частности, я бы ожидал предупреждения об использовании как bar
, так и baz
до их объявления.(Предполагается, что bar
будет возвращать id
, а baz
будет возвращаться int
.)
GCC отображает оба предупреждения, как и LLVM Clang 2.9.Однако Clang 3 может выяснить, что bar
и baz
существуют и что они возвращают. Предупреждение не появляется (если функции не удалены).
(Когда baz
объявлено вне класса, предупреждение все равно появляется. Так что это относится только к Objective-C!)
Круто! Это позволило бы удалить много дубликатов.Но что происходит?Это расширение языка?Это функция компилятора?Это ошибка?Или я ошибаюсь по этому поводу?Я не смог найти никакой документации по этому вопросу, поэтому я опасаюсь полагаться на это. У кого-нибудь есть понимание?