return hasDesignatedInitializers() || inheritsDesignatedInitializers();
}
- bool hasDesignatedInitializersInSuperClass() const;
-
const ObjCProtocolList &getReferencedProtocols() const {
assert(hasDefinition() && "Caller did not check for forward reference!");
if (data().ExternallyCompleted)
void DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D);
void DiagnoseMissingDesignatedInitOverrides(
- const ObjCImplementationDecl *ImplD);
+ const ObjCImplementationDecl *ImplD,
+ const ObjCInterfaceDecl *IFD);
void DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID, ObjCInterfaceDecl *SID);
return data().HasDesignatedInitializers;
}
-bool ObjCInterfaceDecl::hasDesignatedInitializersInSuperClass() const {
- ObjCInterfaceDecl *OSC = getSuperClass();
- while (OSC) {
- if (OSC->hasDesignatedInitializers())
- return true;
- OSC = OSC->getSuperClass();
- }
- return false;
-}
-
StringRef
ObjCInterfaceDecl::getObjCRuntimeNameAsString() const {
if (ObjCRuntimeNameAttr *ObjCRTName = getAttr<ObjCRuntimeNameAttr>())
AtomicPropertySetterGetterRules(IC, IDecl);
DiagnoseOwningPropertyGetterSynthesis(IC);
DiagnoseUnusedBackingIvarInAccessor(S, IC);
- if (IDecl->hasDesignatedInitializers() ||
- IDecl->hasDesignatedInitializersInSuperClass())
- DiagnoseMissingDesignatedInitOverrides(IC);
+ if (IDecl->hasDesignatedInitializers())
+ DiagnoseMissingDesignatedInitOverrides(IC, IDecl);
bool HasRootClassAttr = IDecl->hasAttr<ObjCRootClassAttr>();
if (IDecl->getSuperClass() == nullptr) {
}
void Sema::DiagnoseMissingDesignatedInitOverrides(
- const ObjCImplementationDecl *ImplD) {
- const ObjCInterfaceDecl *IFD = ImplD->getClassInterface();
- assert(IFD);
- assert(IFD->hasDesignatedInitializers() ||
- IFD->hasDesignatedInitializersInSuperClass());
+ const ObjCImplementationDecl *ImplD,
+ const ObjCInterfaceDecl *IFD) {
+ assert(IFD->hasDesignatedInitializers());
const ObjCInterfaceDecl *SuperD = IFD->getSuperClass();
if (!SuperD)
return;
@end
@interface B1()
--(id)initB3 NS_DESIGNATED_INITIALIZER; // expected-note 6 {{method marked as designated initializer of the class here}}
+-(id)initB3 NS_DESIGNATED_INITIALIZER; // expected-note 4 {{method marked as designated initializer of the class here}}
@end;
@implementation B1
-(id)initB1;
@end
-@implementation SS4 // expected-warning {{method override for the designated initializer of the superclass '-initB3' not found}}
+@implementation SS4
-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
return 0;
}
-(id)initB1;
@end
-@implementation SS9 // expected-warning {{method override for the designated initializer of the superclass '-initB3' not found}}
+@implementation SS9
-(id)initB1 { // expected-warning {{designated initializer missing a 'super' call to a designated initializer of the super class}}
return 0;
}
@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
-
-// rdar://19653785
-@class NSCoder;
-
-@interface NSView
-- (instancetype)initWithFrame:(int)frameRect NS_DESIGNATED_INITIALIZER; // expected-note {{method marked as designated initializer of the class here}}
-- (instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; // expected-note 2 {{method marked as designated initializer of the class here}}
-@end
-
-@interface MyHappyView : NSView
-- (instancetype)initWithFrame:(int)frameRect andOtherThing:(id)otherThing NS_DESIGNATED_INITIALIZER;
-@end
-
-@implementation MyHappyView // expected-warning {{method override for the designated initializer of the superclass '-initWithCoder:' not found}}
-- (instancetype)initWithFrame:(int)frameRect andOtherThing:(id)otherThing {
- if (self = [super initWithFrame:frameRect]) {
- }
- return self;
-}
-
-- (instancetype)initWithFrame:(int)frameRect {
- return [self initWithFrame:frameRect andOtherThing:((void *)0)];
-}
-@end
-
-@interface MySadView : NSView
-@end
-
-@implementation MySadView // expected-warning {{method override for the designated initializer of the superclass '-initWithFrame:' not found}} \
- // expected-warning {{method override for the designated initializer of the superclass '-initWithCoder:' not found}}
-- (instancetype)initWithFrame:(int)frameRect andOtherThing:(id)otherThing {
- if (self = [super initWithFrame:frameRect]) {
- }
-
- return self;
-}
-@end
-