1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 03:23:01 +02:00

fix rdar://7997827 - Accept and ignore LL and ULL suffixes on integer literals.

Also fix 0b010 syntax to actually work while we're at it :-)

llvm-svn: 111876
This commit is contained in:
Chris Lattner 2010-08-24 00:43:25 +00:00
parent 696d6ee9d7
commit 115fdde871
2 changed files with 43 additions and 2 deletions

View File

@ -117,6 +117,13 @@ AsmToken AsmLexer::LexLineComment() {
return AsmToken(AsmToken::EndOfStatement, StringRef(CurPtr, 0));
}
static void SkipIgnoredIntegerSuffix(const char *&CurPtr) {
if (CurPtr[0] == 'L' && CurPtr[1] == 'L')
CurPtr += 2;
if (CurPtr[0] == 'U' && CurPtr[1] == 'L' && CurPtr[2] == 'L')
CurPtr += 3;
}
/// LexDigit: First character is [0-9].
/// Local Label: [0-9][:]
@ -133,7 +140,7 @@ AsmToken AsmLexer::LexDigit() {
++CurPtr;
StringRef Result(TokStart, CurPtr - TokStart);
long long Value;
if (Result.getAsInteger(10, Value)) {
// We have to handle minint_as_a_positive_value specially, because
@ -143,6 +150,11 @@ AsmToken AsmLexer::LexDigit() {
else
return ReturnError(TokStart, "Invalid decimal number");
}
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, Result, Value);
}
@ -165,9 +177,13 @@ AsmToken AsmLexer::LexDigit() {
StringRef Result(TokStart, CurPtr - TokStart);
long long Value;
if (Result.getAsInteger(2, Value))
if (Result.substr(2).getAsInteger(2, Value))
return ReturnError(TokStart, "Invalid binary number");
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, Result, Value);
}
@ -185,6 +201,10 @@ AsmToken AsmLexer::LexDigit() {
if (StringRef(TokStart, CurPtr - TokStart).getAsInteger(0, Result))
return ReturnError(TokStart, "Invalid hexadecimal number");
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, StringRef(TokStart, CurPtr - TokStart),
(int64_t)Result);
}
@ -198,6 +218,10 @@ AsmToken AsmLexer::LexDigit() {
if (Result.getAsInteger(8, Value))
return ReturnError(TokStart, "Invalid octal number");
// The darwin/x86 (and x86-64) assembler accepts and ignores ULL and LL
// suffixes on integer literals.
SkipIgnoredIntegerSuffix(CurPtr);
return AsmToken(AsmToken::Integer, Result, Value);
}

View File

@ -19,3 +19,20 @@ TEST2:
# CHECK: .quad 9
TEST3:
.quad 9
# rdar://7997827
TEST4:
.quad 0b0100
.quad 4294967295
.quad 4294967295+1
.quad 4294967295LL+1
.quad 0b10LL + 07ULL + 0x42AULL
# CHECK: TEST4
# CHECK: .quad 4
# CHECK: .quad 4294967295
# CHECK: .quad 4294967296
# CHECK: .quad 4294967296
# CHECK: .quad 1075