mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-11 08:48:12 +00:00
Fix crashes on missing @interface for category
In a few places we didn't check that Category->getClassInterface() was not null before using it. llvm-svn: 226605
This commit is contained in:
parent
e7d3dfdb75
commit
c91ac9ed49
@ -13979,7 +13979,10 @@ Decl *Sema::getObjCDeclContext() const {
|
||||
}
|
||||
|
||||
AvailabilityResult Sema::getCurContextAvailability() const {
|
||||
const Decl *D = cast<Decl>(getCurObjCLexicalContext());
|
||||
const Decl *D = cast_or_null<Decl>(getCurObjCLexicalContext());
|
||||
if (!D)
|
||||
return AR_Available;
|
||||
|
||||
// If we are within an Objective-C method, we should consult
|
||||
// both the availability of the method as well as the
|
||||
// enclosing class. If the class is (say) deprecated,
|
||||
|
@ -3783,6 +3783,10 @@ static void handleObjCDesignatedInitializer(Sema &S, Decl *D,
|
||||
IFace = CatDecl->getClassInterface();
|
||||
else
|
||||
IFace = cast<ObjCInterfaceDecl>(D->getDeclContext());
|
||||
|
||||
if (!IFace)
|
||||
return;
|
||||
|
||||
IFace->setHasDesignatedInitializers();
|
||||
D->addAttr(::new (S.Context)
|
||||
ObjCDesignatedInitializerAttr(Attr.getRange(), S.Context,
|
||||
@ -5059,7 +5063,8 @@ static bool isDeclDeprecated(Decl *D) {
|
||||
return true;
|
||||
// A category implicitly has the availability of the interface.
|
||||
if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(D))
|
||||
return CatD->getClassInterface()->isDeprecated();
|
||||
if (const ObjCInterfaceDecl *Interface = CatD->getClassInterface())
|
||||
return Interface->isDeprecated();
|
||||
} while ((D = cast_or_null<Decl>(D->getDeclContext())));
|
||||
return false;
|
||||
}
|
||||
@ -5070,7 +5075,8 @@ static bool isDeclUnavailable(Decl *D) {
|
||||
return true;
|
||||
// A category implicitly has the availability of the interface.
|
||||
if (const ObjCCategoryDecl *CatD = dyn_cast<ObjCCategoryDecl>(D))
|
||||
return CatD->getClassInterface()->isUnavailable();
|
||||
if (const ObjCInterfaceDecl *Interface = CatD->getClassInterface())
|
||||
return Interface->isUnavailable();
|
||||
} while ((D = cast_or_null<Decl>(D->getDeclContext())));
|
||||
return false;
|
||||
}
|
||||
|
@ -76,8 +76,8 @@ bool Sema::CanUseDecl(NamedDecl *D) {
|
||||
static void DiagnoseUnusedOfDecl(Sema &S, NamedDecl *D, SourceLocation Loc) {
|
||||
// Warn if this is used but marked unused.
|
||||
if (D->hasAttr<UnusedAttr>()) {
|
||||
const Decl *DC = cast<Decl>(S.getCurObjCLexicalContext());
|
||||
if (!DC->hasAttr<UnusedAttr>())
|
||||
const Decl *DC = cast_or_null<Decl>(S.getCurObjCLexicalContext());
|
||||
if (DC && !DC->hasAttr<UnusedAttr>())
|
||||
S.Diag(Loc, diag::warn_used_but_marked_unused) << D->getDeclName();
|
||||
}
|
||||
}
|
||||
|
@ -284,3 +284,14 @@ void f(id a) {
|
||||
void g(id a) {
|
||||
[a anotherPartiallyUnavailableMethod]; // no warning, `a` could be an InterfaceWithImplementation.
|
||||
}
|
||||
|
||||
typedef struct {} S1 __attribute__((unavailable)); // expected-note2{{marked unavailable here}}
|
||||
typedef struct {} S2 __attribute__((deprecated)); // expected-note2{{marked deprecated here}}
|
||||
@interface ExtensionForMissingInterface() // expected-error{{cannot find interface declaration}}
|
||||
- (void)method1:(S1) x; // expected-error{{is unavailable}}
|
||||
- (void)method2:(S2) x; // expected-warning{{is deprecated}}
|
||||
@end
|
||||
@interface CategoryForMissingInterface(Cat) // expected-error{{cannot find interface declaration}}
|
||||
- (void)method1:(S1) x; // expected-error{{is unavailable}}
|
||||
- (void)method2:(S2) x; // expected-warning{{is deprecated}}
|
||||
@end
|
||||
|
@ -410,3 +410,11 @@ __attribute__((objc_root_class))
|
||||
return [super init];
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ExtensionForMissingInterface() // expected-error{{cannot find interface declaration}}
|
||||
- (instancetype)init NS_DESIGNATED_INITIALIZER;
|
||||
@end
|
||||
|
||||
@interface CategoryForMissingInterface(Cat) // expected-error{{cannot find interface declaration}}
|
||||
- (instancetype)init NS_DESIGNATED_INITIALIZER; // expected-error{{only applies to init methods of interface or class extension declarations}}
|
||||
@end
|
||||
|
Loading…
Reference in New Issue
Block a user