[Lexer] Ensure that the token is not an annotation token when
authorAlex Lorenz <arphaman@gmail.com>
Wed, 17 May 2017 11:08:36 +0000 (11:08 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Wed, 17 May 2017 11:08:36 +0000 (11:08 +0000)
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

clang/lib/Lex/Lexer.cpp
clang/test/Modules/Inputs/module.map
clang/test/Modules/Inputs/objcAtKeywordMissingEnd.h [new file with mode: 0644]
clang/test/Modules/objc-at-keyword.m [new file with mode: 0644]

index 3d6fe91..92942fd 100644 (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;
 }
index 7416d70..c0fe6c5 100644 (file)
@@ -441,3 +441,7 @@ module DebugNestedB {
   header "DebugNestedB.h"
   export *
 }
+
+module objcAtKeywordMissingEnd {
+  header "objcAtKeywordMissingEnd.h"
+}
diff --git a/clang/test/Modules/Inputs/objcAtKeywordMissingEnd.h b/clang/test/Modules/Inputs/objcAtKeywordMissingEnd.h
new file mode 100644 (file)
index 0000000..1196b87
--- /dev/null
@@ -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/clang/test/Modules/objc-at-keyword.m b/clang/test/Modules/objc-at-keyword.m
new file mode 100644 (file)
index 0000000..0e058a3
--- /dev/null
@@ -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'}}