diff --git a/lib/MC/MCParser/AsmLexer.cpp b/lib/MC/MCParser/AsmLexer.cpp index b49dd010479..a066e648303 100644 --- a/lib/MC/MCParser/AsmLexer.cpp +++ b/lib/MC/MCParser/AsmLexer.cpp @@ -139,20 +139,23 @@ AsmToken AsmLexer::LexHexFloatLiteral(bool NoIntDigits) { } /// LexIdentifier: [a-zA-Z_.][a-zA-Z0-9_$.@?]* -static bool IsIdentifierChar(char c) { - return isalnum(c) || c == '_' || c == '$' || c == '.' || c == '@' || c == '?'; +static bool IsIdentifierChar(char c, bool AllowAt) { + return isalnum(c) || c == '_' || c == '$' || c == '.' || + (c == '@' && AllowAt) || c == '?'; } AsmToken AsmLexer::LexIdentifier() { + bool AllowAtInIdentifier = !StringRef(MAI.getCommentString()).startswith("@"); // Check for floating point literals. if (CurPtr[-1] == '.' && isdigit(*CurPtr)) { // Disambiguate a .1243foo identifier from a floating literal. while (isdigit(*CurPtr)) ++CurPtr; - if (*CurPtr == 'e' || *CurPtr == 'E' || !IsIdentifierChar(*CurPtr)) + if (*CurPtr == 'e' || *CurPtr == 'E' || + !IsIdentifierChar(*CurPtr, AllowAtInIdentifier)) return LexFloatLiteral(); } - while (IsIdentifierChar(*CurPtr)) + while (IsIdentifierChar(*CurPtr, AllowAtInIdentifier)) ++CurPtr; // Handle . as a special case. diff --git a/test/MC/ARM/comment.s b/test/MC/ARM/comment.s new file mode 100644 index 00000000000..e95f313aca2 --- /dev/null +++ b/test/MC/ARM/comment.s @@ -0,0 +1,24 @@ +@ Tests to check that '@' does not get lexed as an identifier for arm +@ RUN: llvm-mc %s -triple=armv7-linux-gnueabi | FileCheck %s +@ RUN: llvm-mc %s -triple=armv7-linux-gnueabi 2>&1 | FileCheck %s --check-prefix=ERROR + +foo: + bl boo@plt should be ignored + bl goo@plt + .long bar@got to parse this as a comment + .long baz@got + add r0, r0@ignore this extra junk + +@CHECK-LABEL: foo: +@CHECK: bl boo +@CHECK-NOT: @ +@CHECK: bl goo +@CHECK-NOT: @ +@CHECK: .long bar +@CHECK-NOT: @ +@CHECK: .long baz +@CHECK-NOT: @ +@CHECK: add r0, r0 +@CHECK-NOT: @ + +@ERROR-NOT: error: