/// 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");
--- /dev/null
+# 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: ^
+