From bd77dc6b8f04ac9afcb5487e91d7a5034521e2cc Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 17 May 2017 11:08:36 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@303246 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/Lexer.cpp | 4 ++++ test/Modules/Inputs/module.map | 4 ++++ test/Modules/Inputs/objcAtKeywordMissingEnd.h | 3 +++ test/Modules/objc-at-keyword.m | 7 +++++++ 4 files changed, 18 insertions(+) create mode 100644 test/Modules/Inputs/objcAtKeywordMissingEnd.h create mode 100644 test/Modules/objc-at-keyword.m diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index 3d6fe91115..92942fd09a 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -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; } diff --git a/test/Modules/Inputs/module.map b/test/Modules/Inputs/module.map index 7416d7008b..c0fe6c557f 100644 --- a/test/Modules/Inputs/module.map +++ b/test/Modules/Inputs/module.map @@ -441,3 +441,7 @@ module DebugNestedB { header "DebugNestedB.h" export * } + +module objcAtKeywordMissingEnd { + header "objcAtKeywordMissingEnd.h" +} diff --git a/test/Modules/Inputs/objcAtKeywordMissingEnd.h b/test/Modules/Inputs/objcAtKeywordMissingEnd.h new file mode 100644 index 0000000000..1196b87eef --- /dev/null +++ b/test/Modules/Inputs/objcAtKeywordMissingEnd.h @@ -0,0 +1,3 @@ +@interface MissingEnd // expected-note {{class started here}} + +@ // expected-error {{expected an Objective-C directive after '@'}} expected-error {{missing '@end'}} diff --git a/test/Modules/objc-at-keyword.m b/test/Modules/objc-at-keyword.m new file mode 100644 index 0000000000..0e058a3090 --- /dev/null +++ b/test/Modules/objc-at-keyword.m @@ -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'}} -- 2.40.0