From de2676076ba218b5c09a88ac26dd86cc97a9d02e Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 17 Nov 2010 19:41:23 +0000 Subject: [PATCH] Warn if direct accessing synthesized ivar backing the property in nonofragile-abi2. Fixes //rdar://8673791 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119543 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticSemaKinds.td | 3 +++ lib/Sema/SemaExpr.cpp | 8 +++++++- test/SemaObjC/direct-synthesized-ivar-access.m | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 test/SemaObjC/direct-synthesized-ivar-access.m diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 277653e7ea..4610a72d28 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -2698,6 +2698,9 @@ def note_condition_assign_to_comparison : Note< def note_condition_assign_silence : Note< "place parentheses around the assignment to silence this warning">; +def warn_synthesized_ivar_access : Warning< + "direct access of synthesized ivar by using property access %0">, + InGroup, DefaultIgnore; def warn_ivar_variable_conflict : Warning< "when default property synthesis is on, " "%0 lookup will access property ivar instead of global variable">, diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 4728b0d199..277da3b78c 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -1446,9 +1446,15 @@ ExprResult Sema::ActOnIdExpression(Scope *S, if (Ex) return Owned(Ex); // Synthesize ivars lazily if (getLangOptions().ObjCNonFragileABI2) { - if (SynthesizeProvisionalIvar(*this, R, II, NameLoc)) + if (SynthesizeProvisionalIvar(*this, R, II, NameLoc)) { + if (const ObjCPropertyDecl *Property = + canSynthesizeProvisionalIvar(II)) { + Diag(NameLoc, diag::warn_synthesized_ivar_access) << II; + Diag(Property->getLocation(), diag::note_property_declare); + } return ActOnIdExpression(S, SS, Id, HasTrailingLParen, isAddressOfOperand); + } } // for further use, this must be set to false if in class method. IvarLookupFollowUp = getCurMethodDecl()->isInstanceMethod(); diff --git a/test/SemaObjC/direct-synthesized-ivar-access.m b/test/SemaObjC/direct-synthesized-ivar-access.m new file mode 100644 index 0000000000..e59fa81662 --- /dev/null +++ b/test/SemaObjC/direct-synthesized-ivar-access.m @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -Wnonfragile-abi2 -fsyntax-only -fobjc-nonfragile-abi2 -verify %s +// rdar://8673791 + +@interface I { +} + +@property int IVAR; // expected-note {{property declared here}} +- (int) OK; +@end + +@implementation I +- (int) Meth { return IVAR; } // expected-warning {{direct access of synthesized ivar by using property access 'IVAR'}} +- (int) OK { return self.IVAR; } +@end -- 2.40.0