Finish parser/printer support for AffineMapOp, implement operand iterators on
VariadicOperands, tidy up some code in the asmprinter, fill out more
verification logic in for LoadOp.

PiperOrigin-RevId: 206443020
diff --git a/lib/Parser/Parser.cpp b/lib/Parser/Parser.cpp
index b2c9bb9..654db98 100644
--- a/lib/Parser/Parser.cpp
+++ b/lib/Parser/Parser.cpp
@@ -1674,10 +1674,18 @@
     switch (delimeter) {
     case Delimeter::NoDelimeter:
       break;
+    case Delimeter::OptionalParenDelimeter:
+      if (parser.getToken().isNot(Token::l_paren))
+        return false;
+      LLVM_FALLTHROUGH;
     case Delimeter::ParenDelimeter:
       if (parser.parseToken(Token::l_paren, "expected '(' in operand list"))
         return true;
       break;
+    case Delimeter::OptionalSquareDelimeter:
+      if (parser.getToken().isNot(Token::l_square))
+        return false;
+      LLVM_FALLTHROUGH;
     case Delimeter::SquareDelimeter:
       if (parser.parseToken(Token::l_square, "expected '[' in operand list"))
         return true;
@@ -1694,14 +1702,17 @@
       } while (parser.consumeIf(Token::comma));
     }
 
-    // Handle delimeters.
+    // Handle delimeters.   If we reach here, the optional delimiters were
+    // present, so we need to parse their closing one.
     switch (delimeter) {
     case Delimeter::NoDelimeter:
       break;
+    case Delimeter::OptionalParenDelimeter:
     case Delimeter::ParenDelimeter:
       if (parser.parseToken(Token::r_paren, "expected ')' in operand list"))
         return true;
       break;
+    case Delimeter::OptionalSquareDelimeter:
     case Delimeter::SquareDelimeter:
       if (parser.parseToken(Token::r_square, "expected ']' in operand list"))
         return true;