check that there are no unexpected operands
authorChris Lattner <sabre@nondot.org>
Wed, 14 Sep 2005 21:59:34 +0000 (21:59 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 14 Sep 2005 21:59:34 +0000 (21:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23359 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/DAGISelEmitter.cpp

index 085f7d2dae5ef4671682fc6e0d7289ea96eae6f6..d83faceaee82a1d5967e75edc035f52176b3c962 100644 (file)
@@ -803,21 +803,29 @@ void DAGISelEmitter::ParseAndResolveInstructions() {
       InstResults.erase(OpName);
     }
 
-    // Loop over the inputs next.
+    // Loop over the inputs next.  Make a copy of InstInputs so we can destroy
+    // the copy while we're checking the inputs.
+    std::map<std::string, TreePatternNode*> InstInputsCheck(InstInputs);
+    
     for (unsigned i = NumResults, e = CGI.OperandList.size(); i != e; ++i) {
       const std::string &OpName = CGI.OperandList[i].Name;
       if (OpName.empty())
         I->error("Operand #" + utostr(i) + " in operands list has no name!");
 
-      if (!InstInputs.count(OpName))
+      if (!InstInputsCheck.count(OpName))
         I->error("Operand $" + OpName +
                  " does not appear in the instruction pattern");
-      TreePatternNode *InVal = InstInputs[OpName];
+      TreePatternNode *InVal = InstInputsCheck[OpName];
+      InstInputsCheck.erase(OpName);
       if (CGI.OperandList[i].Ty != InVal->getType())
         I->error("Operand $" + OpName +
                  "'s type disagrees between the operand and pattern");
     }
     
+    if (!InstInputsCheck.empty())
+      I->error("Input operand $" + InstInputsCheck.begin()->first +
+               " occurs in pattern but not in operands list!");
+               
     unsigned NumOperands = CGI.OperandList.size()-NumResults;
      
     DEBUG(I->dump());