From: Chris Lattner Date: Thu, 27 Dec 2007 19:57:00 +0000 (+0000) Subject: - Use Tok.isObjCAtKeyword instead of Tok.getIdentifierInfo()->getObjCKeywordID(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb53b361bce341c8591333c6997f62e480acc0b4;p=clang - Use Tok.isObjCAtKeyword instead of Tok.getIdentifierInfo()->getObjCKeywordID(). The later fails if the token is not an identifier. - Replace tabs with spaces. - Various other cleanups. Patch by Nico Weber! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45368 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index a701d2fffb..5dcbde1d59 100644 --- a/Parse/ParseObjc.cpp +++ b/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 allMethods; llvm::SmallVector 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/Parse/Parser.cpp b/Parse/Parser.cpp index 732311d6c2..2e15cbde04 100644 --- a/Parse/Parser.cpp +++ b/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/test/Parser/objc-try-catch-1.m b/test/Parser/objc-try-catch-1.m index 6a0acd13dc..d6ad8d38ef 100644 --- a/test/Parser/objc-try-catch-1.m +++ b/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 {} }