Add support for parsing [expr].
authorRoman Divacky <rdivacky@freebsd.org>
Tue, 15 Feb 2011 20:43:39 +0000 (20:43 +0000)
committerRoman Divacky <rdivacky@freebsd.org>
Tue, 15 Feb 2011 20:43:39 +0000 (20:43 +0000)
This is submitted by Joerg Sonnenberger and fixes his PR8685.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125595 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCParser/AsmParser.cpp
test/MC/AsmParser/exprs.s
test/MC/AsmParser/paren.s [new file with mode: 0644]

index ae072d883ba08da7279486e50272ca00a0b9c835..c6d0da609b3b728a438e09960136f4d268084ae6 100644 (file)
@@ -173,6 +173,7 @@ private:
   bool ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc);
   bool ParseBinOpRHS(unsigned Precedence, const MCExpr *&Res, SMLoc &EndLoc);
   bool ParseParenExpr(const MCExpr *&Res, SMLoc &EndLoc);
+  bool ParseBracketExpr(const MCExpr *&Res, SMLoc &EndLoc);
 
   /// ParseIdentifier - Parse an identifier or string (as a quoted identifier)
   /// and set \arg Res to the identifier contents.
@@ -492,6 +493,20 @@ bool AsmParser::ParseParenExpr(const MCExpr *&Res, SMLoc &EndLoc) {
   return false;
 }
 
+/// ParseBracketExpr - Parse a bracket expression and return it.
+/// NOTE: This assumes the leading '[' has already been consumed.
+///
+/// bracketexpr ::= expr]
+///
+bool AsmParser::ParseBracketExpr(const MCExpr *&Res, SMLoc &EndLoc) {
+  if (ParseExpression(Res)) return true;
+  if (Lexer.isNot(AsmToken::RBrac))
+    return TokError("expected ']' in brackets expression");
+  EndLoc = Lexer.getLoc();
+  Lex();
+  return false;
+}
+
 /// ParsePrimaryExpr - Parse a primary expression and return it.
 ///  primaryexpr ::= (parenexpr
 ///  primaryexpr ::= symbol
@@ -587,6 +602,9 @@ bool AsmParser::ParsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
   case AsmToken::LParen:
     Lex(); // Eat the '('.
     return ParseParenExpr(Res, EndLoc);
+  case AsmToken::LBrac:
+    Lex(); // Eat the '['.
+    return ParseBracketExpr(Res, EndLoc);
   case AsmToken::Minus:
     Lex(); // Eat the operator.
     if (ParsePrimaryExpr(Res, EndLoc))
index 153701d6852ac1abfa095226daf1a86249a8b673..0861922b603ce2c13dd9de9151f4bb29b7878b45 100644 (file)
@@ -35,6 +35,8 @@ k:
         check_expr 1 << 1, 2
         check_expr 2 >> 1, 1
         check_expr (~0 >> 1), -1
+        check_expr [~0 >> 1], -1
+        check_expr 4 * [4 + (3 + [2 * 2] + 1)], 48
         check_expr 3 - 2, 1
         check_expr 1 ^ 3, 2
         check_expr 1 && 2, 1
diff --git a/test/MC/AsmParser/paren.s b/test/MC/AsmParser/paren.s
new file mode 100644 (file)
index 0000000..702e309
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: not llvm-mc -triple i386-unknown-unknown %s 2> %t1 > %t2
+// RUN: FileCheck < %t1 %s
+
+// CHECK: error: expected ']' in brackets expression
+.size  x, [.-x)
+
+// CHECK: error: expected ')' in parentheses expression
+.size  y, (.-y]