From: Anders Carlsson Date: Sat, 2 Oct 2010 17:45:21 +0000 (+0000) Subject: Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarati... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=42499be29b620d2eae34beb0f4d0f9da5a9584da;p=clang Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarations. Fixes PR8169. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@115411 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/clang.xcodeproj/project.pbxproj b/clang.xcodeproj/project.pbxproj index 2a25645088..def722b45e 100644 --- a/clang.xcodeproj/project.pbxproj +++ b/clang.xcodeproj/project.pbxproj @@ -2039,6 +2039,7 @@ isa = PBXProject; buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */; compatibilityVersion = "Xcode 2.4"; + developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 1c4a226b85..5751ae90f2 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -218,8 +218,12 @@ def err_illegal_super_cast : Error< def err_objc_illegal_visibility_spec : Error< "illegal visibility specification">; def err_objc_illegal_interface_qual : Error<"illegal interface qualifier">; -def err_objc_expected_equal : Error< - "setter/getter expects '=' followed by name">; +def err_objc_expected_equal_for_getter : Error< + "expected '=' for Objective-C getter">; +def err_objc_expected_equal_for_setter : Error< + "expected '=' for Objective-C setter">; +def err_objc_expected_selector_for_getter_setter : Error< + "expected selector for Objective-C %select{setter|getter}0">; def err_objc_property_requires_field_name : Error< "property requires fields to be named">; def err_objc_property_bitfield : Error<"property name cannot be a bitfield">; diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index 3291736acc..09053e28cc 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -504,13 +504,17 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS, Decl *ClassDecl, else if (II->isStr("nonatomic")) DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nonatomic); else if (II->isStr("getter") || II->isStr("setter")) { + bool IsSetter = II->getNameStart()[0] == 's'; + // getter/setter require extra treatment. - if (ExpectAndConsume(tok::equal, diag::err_objc_expected_equal, "", - tok::r_paren)) + unsigned DiagID = IsSetter ? diag::err_objc_expected_equal_for_setter : + diag::err_objc_expected_equal_for_getter; + + if (ExpectAndConsume(tok::equal, DiagID, "", tok::r_paren)) return; if (Tok.is(tok::code_completion)) { - if (II->getNameStart()[0] == 's') + if (IsSetter) Actions.CodeCompleteObjCPropertySetter(getCurScope(), ClassDecl, Methods, NumMethods); else @@ -519,16 +523,20 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS, Decl *ClassDecl, ConsumeCodeCompletionToken(); } - if (Tok.isNot(tok::identifier)) { - Diag(Tok, diag::err_expected_ident); + + SourceLocation SelLoc; + IdentifierInfo *SelIdent = ParseObjCSelectorPiece(SelLoc); + + if (!SelIdent) { + Diag(Tok, diag::err_objc_expected_selector_for_getter_setter) + << IsSetter; SkipUntil(tok::r_paren); return; } - if (II->getNameStart()[0] == 's') { + if (IsSetter) { DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_setter); - DS.setSetterName(Tok.getIdentifierInfo()); - ConsumeToken(); // consume method name + DS.setSetterName(SelIdent); if (ExpectAndConsume(tok::colon, diag::err_expected_colon_after_setter_name, "", @@ -536,8 +544,7 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS, Decl *ClassDecl, return; } else { DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_getter); - DS.setGetterName(Tok.getIdentifierInfo()); - ConsumeToken(); // consume method name + DS.setGetterName(SelIdent); } } else { Diag(AttrName, diag::err_objc_expected_property_attr) << II; diff --git a/test/SemaObjCXX/reserved-keyword-methods.mm b/test/SemaObjCXX/reserved-keyword-methods.mm index 2ed166ef60..1302128ac0 100644 --- a/test/SemaObjCXX/reserved-keyword-methods.mm +++ b/test/SemaObjCXX/reserved-keyword-methods.mm @@ -34,8 +34,9 @@ macro(wchar_t) #define DECLARE_METHOD(name) - (void)name; - +#define DECLARE_PROPERTY_WITH_GETTER(name) @property (getter=name) int prop_##name; @interface A -FOR_EACH_KEYWORD(DECLARE_METHOD) +//FOR_EACH_KEYWORD(DECLARE_METHOD) +FOR_EACH_KEYWORD(DECLARE_PROPERTY_WITH_GETTER) @end