aboutsummaryrefslogtreecommitdiff
path: root/lib/Parse/ParseObjc.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-10-20 07:22:18 +0000
committerChris Lattner <sabre@nondot.org>2008-10-20 07:22:18 +0000
commitf6ed85533583dae18a44ddc4be6cfc4d68749e36 (patch)
treeb600463d4ac89965f3f1378308fac29125b23294 /lib/Parse/ParseObjc.cpp
parentcd9f4b31c4fe5b77b5519cc17b4583fab912bad1 (diff)
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
Diffstat (limited to 'lib/Parse/ParseObjc.cpp')
-rw-r--r--lib/Parse/ParseObjc.cpp22
1 files changed, 15 insertions, 7 deletions
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