From 14b42a1c92b47bced8e6b94a0213a8970d1c0edd Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 28 Dec 2013 06:39:29 +0000 Subject: [PATCH] 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 --- lib/MC/MCParser/AsmParser.cpp | 13 ++++-- .../MC/AsmParser/directive_rept-diagnostics.s | 41 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 test/MC/AsmParser/directive_rept-diagnostics.s diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index b4c5f50a99f..4b83144f3bd 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -3958,12 +3958,19 @@ void AsmParser::instantiateMacroLikeBody(MCAsmMacro *M, SMLoc DirectiveLoc, /// parseDirectiveRept /// ::= .rep | .rept count bool AsmParser::parseDirectiveRept(SMLoc DirectiveLoc, StringRef Dir) { + const MCExpr *CountExpr; + SMLoc CountLoc = getTok().getLoc(); + if (parseExpression(CountExpr)) + return true; + int64_t Count; - if (parseAbsoluteExpression(Count)) - return TokError("unexpected token in '" + Dir + "' directive"); + if (!CountExpr->EvaluateAsAbsolute(Count)) { + eatToEndOfStatement(); + return Error(CountLoc, "unexpected token in '" + Dir + "' directive"); + } if (Count < 0) - return TokError("Count is negative"); + return Error(CountLoc, "Count is negative"); if (Lexer.isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in '" + Dir + "' directive"); diff --git a/test/MC/AsmParser/directive_rept-diagnostics.s b/test/MC/AsmParser/directive_rept-diagnostics.s new file mode 100644 index 00000000000..cbef1586900 --- /dev/null +++ b/test/MC/AsmParser/directive_rept-diagnostics.s @@ -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: ^ +