From: Fariborz Jahanian Date: Mon, 17 Mar 2014 21:41:40 +0000 (+0000) Subject: Objective-C. Consider blocks for designated initializer X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7513eb534ac159ffa584ae9ccdc38a81373ff3d3;p=clang Objective-C. Consider blocks for designated initializer warnings (warning or lack there of) as well since blocks are another pattern for envoking other designated initializers. // rdar://16323233 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204081 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 5e72f769d7..5e27001858 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -1013,6 +1013,18 @@ public: return FunctionScopes.back(); } + sema::FunctionScopeInfo *getEnclosingFunction() const { + if (FunctionScopes.empty()) + return 0; + + for (int e = FunctionScopes.size()-1; e >= 0; --e) { + if (isa(FunctionScopes[e])) + continue; + return FunctionScopes[e]; + } + return 0; + } + template void recordUseOfEvaluatedWeak(const ExprT *E, bool IsRead=true) { if (!isUnevaluatedContext()) diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 7a3aa46ae6..d878179d78 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -2499,8 +2499,12 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, } } - if (Method && Method->getMethodFamily() == OMF_init && - getCurFunction()->ObjCIsDesignatedInit && + FunctionScopeInfo *DIFunctionScopeInfo = + (Method && Method->getMethodFamily() == OMF_init) + ? getEnclosingFunction() : 0; + + if (DIFunctionScopeInfo && + DIFunctionScopeInfo->ObjCIsDesignatedInit && (SuperLoc.isValid() || isSelfExpr(Receiver))) { bool isDesignatedInitChain = false; if (SuperLoc.isValid()) { @@ -2512,7 +2516,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, if (!ID->declaresOrInheritsDesignatedInitializers() || ID->isDesignatedInitializer(Sel)) { isDesignatedInitChain = true; - getCurFunction()->ObjCWarnForNoDesignatedInitChain = false; + DIFunctionScopeInfo->ObjCWarnForNoDesignatedInitChain = false; } } } @@ -2531,13 +2535,13 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, } } - if (Method && Method->getMethodFamily() == OMF_init && - getCurFunction()->ObjCIsSecondaryInit && + if (DIFunctionScopeInfo && + DIFunctionScopeInfo->ObjCIsSecondaryInit && (SuperLoc.isValid() || isSelfExpr(Receiver))) { if (SuperLoc.isValid()) { Diag(SelLoc, diag::warn_objc_secondary_init_super_init_call); } else { - getCurFunction()->ObjCWarnForNoInitDelegation = false; + DIFunctionScopeInfo->ObjCWarnForNoInitDelegation = false; } } diff --git a/test/SemaObjC/attr-designated-init.m b/test/SemaObjC/attr-designated-init.m index fccf21536c..c743afe82f 100644 --- a/test/SemaObjC/attr-designated-init.m +++ b/test/SemaObjC/attr-designated-init.m @@ -36,7 +36,7 @@ __attribute__((objc_root_class)) @interface B1 -(id)initB1 NS_DESIGNATED_INITIALIZER; // expected-note 6 {{method marked as designated initializer of the class here}} -(id)initB2; --(id)initB3 NS_DESIGNATED_INITIALIZER; // expected-note 3 {{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 @@ -131,7 +131,7 @@ __attribute__((objc_root_class)) [s initB1]; [self meth]; void (^blk)(void) = ^{ - [self initB1]; + [self initB1]; // expected-warning {{designated initializer should only invoke a designated initializer on 'super'}} }; return [super initB3]; } @@ -168,7 +168,7 @@ __attribute__((objc_root_class)) -(id)initS5 { [super initB1]; // expected-warning {{secondary initializer should not invoke an initializer on 'super'}} void (^blk)(void) = ^{ - [super initB1]; + [super initB1]; // expected-warning {{secondary initializer should not invoke an initializer on 'super'}} }; return [self initS1]; } @@ -262,3 +262,26 @@ __attribute__((objc_root_class)) return ((void*)0); } @end + +// rdar://16323233 +__attribute__((objc_root_class)) +@interface B4 +-(id)initB4 NS_DESIGNATED_INITIALIZER; +@end + +@interface rdar16323233 : B4 +-(id)initS4 NS_DESIGNATED_INITIALIZER; +@end + +@implementation rdar16323233 +-(id)initS4 { + static id sSharedObject = (void*)0; + (void)^(void) { + sSharedObject = [super initB4]; + }; + return 0; +} +-(id)initB4 { + return [self initS4]; +} +@end