mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-05 09:24:28 +00:00
AsmParser: cleanup diagnostics for .rep/.rept
Avoid double diagnostics for invalid expressions for count. Improve caret location for negative count. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198099 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -3958,12 +3958,19 @@ void AsmParser::instantiateMacroLikeBody(MCAsmMacro *M, SMLoc DirectiveLoc,
|
|||||||
/// parseDirectiveRept
|
/// parseDirectiveRept
|
||||||
/// ::= .rep | .rept count
|
/// ::= .rep | .rept count
|
||||||
bool AsmParser::parseDirectiveRept(SMLoc DirectiveLoc, StringRef Dir) {
|
bool AsmParser::parseDirectiveRept(SMLoc DirectiveLoc, StringRef Dir) {
|
||||||
|
const MCExpr *CountExpr;
|
||||||
|
SMLoc CountLoc = getTok().getLoc();
|
||||||
|
if (parseExpression(CountExpr))
|
||||||
|
return true;
|
||||||
|
|
||||||
int64_t Count;
|
int64_t Count;
|
||||||
if (parseAbsoluteExpression(Count))
|
if (!CountExpr->EvaluateAsAbsolute(Count)) {
|
||||||
return TokError("unexpected token in '" + Dir + "' directive");
|
eatToEndOfStatement();
|
||||||
|
return Error(CountLoc, "unexpected token in '" + Dir + "' directive");
|
||||||
|
}
|
||||||
|
|
||||||
if (Count < 0)
|
if (Count < 0)
|
||||||
return TokError("Count is negative");
|
return Error(CountLoc, "Count is negative");
|
||||||
|
|
||||||
if (Lexer.isNot(AsmToken::EndOfStatement))
|
if (Lexer.isNot(AsmToken::EndOfStatement))
|
||||||
return TokError("unexpected token in '" + Dir + "' directive");
|
return TokError("unexpected token in '" + Dir + "' directive");
|
||||||
|
41
test/MC/AsmParser/directive_rept-diagnostics.s
Normal file
41
test/MC/AsmParser/directive_rept-diagnostics.s
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# RUN: not llvm-mc -triple i686-elf -filetype asm -o /dev/null %s 2>&1 \
|
||||||
|
# RUN: | FileCheck %s
|
||||||
|
|
||||||
|
.data
|
||||||
|
|
||||||
|
.global invalid_expression
|
||||||
|
.type invalid_expression,@object
|
||||||
|
invalid_expression:
|
||||||
|
.rept *
|
||||||
|
|
||||||
|
# CHECK: error: unknown token in expression
|
||||||
|
# CHECK: .rept *
|
||||||
|
# CHECK: ^
|
||||||
|
|
||||||
|
.global bad_token
|
||||||
|
.type bad_token,@object
|
||||||
|
bad_token:
|
||||||
|
.rept bad_token
|
||||||
|
|
||||||
|
# CHECK: error: unexpected token in '.rept' directive
|
||||||
|
# CHECK: .rept bad_token
|
||||||
|
# CHECK: ^
|
||||||
|
|
||||||
|
.global negative
|
||||||
|
.type negative,@object
|
||||||
|
negative:
|
||||||
|
.rept -32
|
||||||
|
|
||||||
|
# CHECK: error: Count is negative
|
||||||
|
# CHECK: .rept -32
|
||||||
|
# CHECK: ^
|
||||||
|
|
||||||
|
.global trailer
|
||||||
|
.type trailer,@object
|
||||||
|
trailer:
|
||||||
|
.rep 0 trailer
|
||||||
|
|
||||||
|
# CHECK: error: unexpected token in '.rep' directive
|
||||||
|
# CHECK: .rep 0 trailer
|
||||||
|
# CHECK: ^
|
||||||
|
|
Reference in New Issue
Block a user