AsmParser: cleanup diagnostics for .rep/.rept
authorSaleem Abdulrasool <compnerd@compnerd.org>
Sat, 28 Dec 2013 06:39:29 +0000 (06:39 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Sat, 28 Dec 2013 06:39:29 +0000 (06:39 +0000)
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
test/MC/AsmParser/directive_rept-diagnostics.s [new file with mode: 0644]

index b4c5f50a99fca7ca50ac599bdf8e10af45f59053..4b83144f3bd2c6ea9037764325bee4fa8432ae6d 100644 (file)
@@ -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 (file)
index 0000000..cbef158
--- /dev/null
@@ -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:               ^
+