summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/Parse/ParseObjc.cpp40
-rw-r--r--clang/Parse/Parser.cpp8
-rw-r--r--clang/test/Parser/objc-try-catch-1.m62
3 files changed, 64 insertions, 46 deletions
diff --git a/clang/Parse/ParseObjc.cpp b/clang/Parse/ParseObjc.cpp
index a701d2fffb7..5dcbde1d59f 100644
--- a/clang/Parse/ParseObjc.cpp
+++ b/clang/Parse/ParseObjc.cpp
@@ -192,7 +192,7 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration(
return 0;
}
DeclTy *ClsType = Actions.ActOnStartClassInterface(
- atLoc, nameId, nameLoc,
+ atLoc, nameId, nameLoc,
superClassId, superClassLoc, &ProtocolRefs[0],
ProtocolRefs.size(), endProtoLoc, attrList);
@@ -223,7 +223,7 @@ Parser::DeclTy *Parser::ParseObjCAtInterfaceDeclaration(
/// @optional
///
void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
- tok::ObjCKeywordKind contextKey) {
+ tok::ObjCKeywordKind contextKey) {
llvm::SmallVector<DeclTy*, 32> allMethods;
llvm::SmallVector<DeclTy*, 16> allProperties;
tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword;
@@ -239,14 +239,14 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
break;
} else if (ocKind == tok::objc_required) { // protocols only
ConsumeToken();
- MethodImplKind = ocKind;
- if (contextKey != tok::objc_protocol)
- Diag(AtLoc, diag::err_objc_protocol_required);
+ MethodImplKind = ocKind;
+ if (contextKey != tok::objc_protocol)
+ Diag(AtLoc, diag::err_objc_protocol_required);
} else if (ocKind == tok::objc_optional) { // protocols only
ConsumeToken();
- MethodImplKind = ocKind;
- if (contextKey != tok::objc_protocol)
- Diag(AtLoc, diag::err_objc_protocol_optional);
+ MethodImplKind = ocKind;
+ if (contextKey != tok::objc_protocol)
+ Diag(AtLoc, diag::err_objc_protocol_optional);
} else if (ocKind == tok::objc_property) {
allProperties.push_back(ParseObjCPropertyDecl(interfaceDecl, AtLoc));
continue;
@@ -327,9 +327,9 @@ void Parser::ParseObjCPropertyAttribute (ObjcDeclSpec &DS) {
}
else {
Diag(loc, diag::err_expected_ident);
- SkipUntil(tok::r_paren,true,true);
- break;
- }
+ SkipUntil(tok::r_paren,true,true);
+ break;
+ }
}
else {
Diag(loc, diag::err_objc_expected_equal);
@@ -409,7 +409,7 @@ Parser::DeclTy *Parser::ParseObjCPropertyDecl(DeclTy *interfaceDecl,
/// __attribute__((deprecated))
///
Parser::DeclTy *Parser::ParseObjCMethodPrototype(DeclTy *IDecl,
- tok::ObjCKeywordKind MethodImplKind) {
+ tok::ObjCKeywordKind MethodImplKind) {
assert((Tok.is(tok::minus) || Tok.is(tok::plus)) && "expected +/-");
tok::TokenKind methodType = Tok.getKind();
@@ -501,7 +501,7 @@ bool Parser::isObjCPropertyAttribute() {
///
void Parser::ParseObjcTypeQualifierList(ObjcDeclSpec &DS) {
while (1) {
- if (!Tok.is(tok::identifier))
+ if (Tok.isNot(tok::identifier))
return;
const IdentifierInfo *II = Tok.getIdentifierInfo();
@@ -587,7 +587,7 @@ Parser::TypeTy *Parser::ParseObjCTypeName(ObjcDeclSpec &DS) {
Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc,
tok::TokenKind mType,
DeclTy *IDecl,
- tok::ObjCKeywordKind MethodImplKind)
+ tok::ObjCKeywordKind MethodImplKind)
{
// Parse the return type.
TypeTy *ReturnType = 0;
@@ -796,8 +796,8 @@ void Parser::ParseObjCClassInstanceVariables(DeclTy *interfaceDecl,
}
ParseStructDeclaration(interfaceDecl, IvarDecls);
for (unsigned i = 0; i < IvarDecls.size(); i++) {
- AllIvarDecls.push_back(IvarDecls[i]);
- AllVisibilities.push_back(visibility);
+ AllIvarDecls.push_back(IvarDecls[i]);
+ AllVisibilities.push_back(visibility);
}
IvarDecls.clear();
@@ -967,7 +967,7 @@ Parser::DeclTy *Parser::ParseObjCAtImplementationDeclaration(
superClassLoc = ConsumeToken(); // Consume super class name
}
DeclTy *ImplClsType = Actions.ActOnStartClassImplementation(
- atLoc, nameId, nameLoc,
+ atLoc, nameId, nameLoc,
superClassId, superClassLoc);
if (Tok.is(tok::l_brace)) // we have ivars
@@ -1127,7 +1127,7 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
TryBody = Actions.ActOnNullStmt(Tok.getLocation());
while (Tok.is(tok::at)) {
SourceLocation AtCatchFinallyLoc = ConsumeToken();
- if (Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_catch) {
+ if (Tok.isObjCAtKeyword(tok::objc_catch)) {
StmtTy *FirstPart = 0;
ConsumeToken(); // consume catch
if (Tok.is(tok::l_paren)) {
@@ -1161,7 +1161,7 @@ Parser::StmtResult Parser::ParseObjCTryStmt(SourceLocation atLoc) {
}
catch_or_finally_seen = true;
}
- else if (Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_finally) {
+ else if (Tok.isObjCAtKeyword(tok::objc_finally)) {
ConsumeToken(); // consume finally
StmtResult FinallyBody = ParseCompoundStatementBody();
if (FinallyBody.isInvalid)
@@ -1478,7 +1478,7 @@ Parser::ExprResult Parser::ParseObjCSelectorExpression(SourceLocation AtLoc)
Diag(Tok, diag::err_expected_colon);
break;
}
- nColons++;
+ nColons++;
ConsumeToken(); // Eat the ':'.
if (Tok.is(tok::r_paren))
break;
diff --git a/clang/Parse/Parser.cpp b/clang/Parse/Parser.cpp
index 732311d6c2d..2e15cbde04b 100644
--- a/clang/Parse/Parser.cpp
+++ b/clang/Parse/Parser.cpp
@@ -374,8 +374,12 @@ Parser::DeclTy *Parser::ParseDeclarationOrFunctionDefinition() {
// ObjC2 allows prefix attributes on class interfaces.
if (getLang().ObjC2 && Tok.is(tok::at)) {
SourceLocation AtLoc = ConsumeToken(); // the "@"
- if (Tok.getIdentifierInfo()->getObjCKeywordID() == tok::objc_interface)
- return ParseObjCAtInterfaceDeclaration(AtLoc, DS.getAttributes());
+ if (!Tok.isObjCAtKeyword(tok::objc_interface)) {
+ Diag(Tok, diag::err_objc_expected_property_attr);//FIXME:better diagnostic
+ SkipUntil(tok::semi); // FIXME: better skip?
+ return 0;
+ }
+ return ParseObjCAtInterfaceDeclaration(AtLoc, DS.getAttributes());
}
// Parse the first declarator.
diff --git a/clang/test/Parser/objc-try-catch-1.m b/clang/test/Parser/objc-try-catch-1.m
index 6a0acd13dcb..d6ad8d38ef7 100644
--- a/clang/test/Parser/objc-try-catch-1.m
+++ b/clang/test/Parser/objc-try-catch-1.m
@@ -10,29 +10,43 @@ void * proc();
void * foo()
{
- @try {
- return proc();
- }
- @catch (Frob* ex) {
- @throw;
- }
- @catch (Frob1* ex) {
- @throw proc();
- }
- @finally {
- @try {
- return proc();
- }
- @catch (Frob* ex) {
- @throw 1,2;
- }
- @catch(...) {
- @throw (4,3,proc());
- }
- }
-
- @try { // expected-error {{@try statment without a @catch and @finally clause}}
- return proc();
- }
+ @try {
+ return proc();
+ }
+ @catch (Frob* ex) {
+ @throw;
+ }
+ @catch (Frob1* ex) {
+ @throw proc();
+ }
+ @finally {
+ @try {
+ return proc();
+ }
+ @catch (Frob* ex) {
+ @throw 1,2;
+ }
+ @catch(...) {
+ @throw (4,3,proc());
+ }
+ }
+
+ @try { // expected-error {{@try statment without a @catch and @finally clause}}
+ return proc();
+ }
+}
+
+
+void bar()
+{
+ @try {}// expected-error {{@try statment without a @catch and @finally clause}}
+ @"s" {} // expected-warning {{result unused}} expected-error {{expected ';'}}
+}
+
+void baz()
+{
+ @try {}// expected-error {{@try statment without a @catch and @finally clause}}
+ @try {}// expected-error {{undeclared identifier}}
+ @finally {}
}
OpenPOWER on IntegriCloud