From: Chris Lattner Date: Mon, 20 Oct 2008 07:22:18 +0000 (+0000) Subject: reject properties completely in objc1 instead of emitting X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f6ed85533583dae18a44ddc4be6cfc4d68749e36;p=clang reject properties completely in objc1 instead of emitting weird errors about property attributes being unknown. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57812 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index 89bf0ce305..474beeb31c 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -422,6 +422,8 @@ DIAG(err_objc_property_requires_field_name, ERROR, "property requires fields to be named") DIAG(err_objc_expected_property_attr, ERROR, "unknown property attribute '%0'") +DIAG(err_objc_propertoes_require_objc2, ERROR, + "properties are an Objective-C 2 feature") DIAG(err_objc_unexpected_attr, ERROR, "prefix attribute must be followed by an interface or protocol") DIAG(err_objc_property_attr_mutually_exclusive, ERROR, diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp index c8544007c3..eee3cac479 100644 --- a/lib/Parse/ParseObjc.cpp +++ b/lib/Parse/ParseObjc.cpp @@ -283,7 +283,7 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl, // continue to eat up tons of stuff and spew lots of nonsense errors. It // would probably be better to bail out if we saw an @class or @interface // or something like that. - Diag(Tok, diag::err_objc_illegal_interface_qual); + Diag(AtLoc, diag::err_objc_illegal_interface_qual); // Skip until we see an '@' or '}' or ';'. SkipUntil(tok::r_brace, tok::at); break; @@ -299,10 +299,14 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl, break; case tok::objc_property: + if (!getLang().ObjC2) + Diag(AtLoc, diag::err_objc_propertoes_require_objc2); + ObjCDeclSpec OCDS; // Parse property attribute list, if any. - if (Tok.is(tok::l_paren)) + if (Tok.is(tok::l_paren)) { ParseObjCPropertyAttribute(OCDS); + } // Parse all the comma separated declarators. DeclSpec DS; @@ -379,6 +383,13 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) { while (1) { const IdentifierInfo *II = Tok.getIdentifierInfo(); + + // If this is not an identifier at all, bail out early. + if (II == 0) { + MatchRHSPunctuation(tok::r_paren, LHSLoc); + return; + } + // getter/setter require extra treatment. if (II == ObjCPropertyAttrs[objc_getter] || II == ObjCPropertyAttrs[objc_setter]) { @@ -416,21 +427,18 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) { else if (II == ObjCPropertyAttrs[objc_assign]) DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_assign); else if (II == ObjCPropertyAttrs[objc_readwrite]) - DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readwrite); + DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readwrite); else if (II == ObjCPropertyAttrs[objc_retain]) DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_retain); else if (II == ObjCPropertyAttrs[objc_copy]) DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_copy); else if (II == ObjCPropertyAttrs[objc_nonatomic]) DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nonatomic); - else if (II) { + else { Diag(Tok.getLocation(), diag::err_objc_expected_property_attr, II->getName()); SkipUntil(tok::r_paren); return; - } else { - MatchRHSPunctuation(tok::r_paren, LHSLoc); - return; } ConsumeToken(); // consume last attribute token