[Lexer] Ensure that the token is not an annotation token when

retrieving the identifer info for an Objective-C keyword

This commit fixes an assertion that's triggered in getIdentifier when the token
is an annotation token.

rdar://32225463

llvm-svn: 303246
This commit is contained in:
Alex Lorenz 2017-05-17 11:08:36 +00:00
parent 4af795b499
commit d47546612d
4 changed files with 18 additions and 0 deletions

View File

@ -43,6 +43,8 @@ using namespace clang;
/// isObjCAtKeyword - Return true if we have an ObjC keyword identifier.
bool Token::isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const {
if (isAnnotation())
return false;
if (IdentifierInfo *II = getIdentifierInfo())
return II->getObjCKeywordID() == objcKey;
return false;
@ -50,6 +52,8 @@ bool Token::isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const {
/// getObjCKeywordID - Return the ObjC keyword kind.
tok::ObjCKeywordKind Token::getObjCKeywordID() const {
if (isAnnotation())
return tok::objc_not_keyword;
IdentifierInfo *specId = getIdentifierInfo();
return specId ? specId->getObjCKeywordID() : tok::objc_not_keyword;
}

View File

@ -441,3 +441,7 @@ module DebugNestedB {
header "DebugNestedB.h"
export *
}
module objcAtKeywordMissingEnd {
header "objcAtKeywordMissingEnd.h"
}

View File

@ -0,0 +1,3 @@
@interface MissingEnd // expected-note {{class started here}}
@ // expected-error {{expected an Objective-C directive after '@'}} expected-error {{missing '@end'}}

View File

@ -0,0 +1,7 @@
// RUN: rm -rf %t
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -verify -x objective-c -fmodule-name=objcAtKeywordMissingEnd -emit-module %S/Inputs/module.map
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -x objective-c -fmodule-name=Empty -emit-module %S/Inputs/module.map
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -verify -I %S/Inputs %s
@interface X // expected-note {{class started here}}
#pragma clang module import Empty // expected-error {{missing '@end'}}