erik.pilkington created this revision. erik.pilkington added a reviewer: arphaman. Herald added subscribers: dexonsmith, jkorous. Herald added a project: clang.
Fixes rdar://47713266 Thanks for taking a look! Erik Repository: rC Clang https://reviews.llvm.org/D57712 Files: clang/lib/Sema/SemaExprObjC.cpp clang/test/SemaObjC/infer-availability-from-init.m Index: clang/test/SemaObjC/infer-availability-from-init.m =================================================================== --- clang/test/SemaObjC/infer-availability-from-init.m +++ clang/test/SemaObjC/infer-availability-from-init.m @@ -56,3 +56,16 @@ [self new]; } @end + +@interface NoInit : NSObject +-(instancetype)init __attribute__((unavailable)); // expected-note {{'init' has been explicitly marked unavailable here}} +@end + +@interface NoInitSub : NoInit @end + +@implementation NoInitSub +-(void)meth:(Class)c { + [c new]; // No error; unknown interface. + [NoInitSub new]; // expected-error {{'new' is unavailable}} +} +@end Index: clang/lib/Sema/SemaExprObjC.cpp =================================================================== --- clang/lib/Sema/SemaExprObjC.cpp +++ clang/lib/Sema/SemaExprObjC.cpp @@ -2805,8 +2805,8 @@ } else { if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) { if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) { - // FIXME: Is this correct? Why are we assuming that a message to - // Class will call a method in the current interface? + // As a guess, try looking for the method in the current interface. + // This very well may not produce the "right" method. // First check the public methods in the class interface. Method = ClassDecl->lookupClassMethod(Sel); @@ -2814,8 +2814,7 @@ if (!Method) Method = ClassDecl->lookupPrivateClassMethod(Sel); - if (Method && DiagnoseUseOfDecl(Method, SelectorSlotLocs, nullptr, - false, false, ClassDecl)) + if (Method && DiagnoseUseOfDecl(Method, SelectorSlotLocs)) return ExprError(); } }
Index: clang/test/SemaObjC/infer-availability-from-init.m =================================================================== --- clang/test/SemaObjC/infer-availability-from-init.m +++ clang/test/SemaObjC/infer-availability-from-init.m @@ -56,3 +56,16 @@ [self new]; } @end + +@interface NoInit : NSObject +-(instancetype)init __attribute__((unavailable)); // expected-note {{'init' has been explicitly marked unavailable here}} +@end + +@interface NoInitSub : NoInit @end + +@implementation NoInitSub +-(void)meth:(Class)c { + [c new]; // No error; unknown interface. + [NoInitSub new]; // expected-error {{'new' is unavailable}} +} +@end Index: clang/lib/Sema/SemaExprObjC.cpp =================================================================== --- clang/lib/Sema/SemaExprObjC.cpp +++ clang/lib/Sema/SemaExprObjC.cpp @@ -2805,8 +2805,8 @@ } else { if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) { if (ObjCInterfaceDecl *ClassDecl = CurMeth->getClassInterface()) { - // FIXME: Is this correct? Why are we assuming that a message to - // Class will call a method in the current interface? + // As a guess, try looking for the method in the current interface. + // This very well may not produce the "right" method. // First check the public methods in the class interface. Method = ClassDecl->lookupClassMethod(Sel); @@ -2814,8 +2814,7 @@ if (!Method) Method = ClassDecl->lookupPrivateClassMethod(Sel); - if (Method && DiagnoseUseOfDecl(Method, SelectorSlotLocs, nullptr, - false, false, ClassDecl)) + if (Method && DiagnoseUseOfDecl(Method, SelectorSlotLocs)) return ExprError(); } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits