//===----------------------------------------------------------------------===//
// attr-dict
-// CHECK: error: 'attr-dict' directive not found in custom assembly format
+// CHECK: error: 'attr-dict' directive not found
def DirectiveAttrDictInvalidA : TestFormat_Op<"attrdict_invalid_a", [{
}]>;
// CHECK: error: 'attr-dict' directive has already been seen
def ZCoverageInvalidA : TestFormat_Op<"variable_invalid_a", [{
attr-dict
}]>, Arguments<(ins AnyMemRef:$operand)>, Results<(outs AnyMemRef:$result)>;
-// CHECK: error: operand #0, named 'operand', not found in custom assembly format
+// CHECK: error: operand #0, named 'operand', not found
// CHECK: note: suggest adding a '$operand' directive to the custom assembly format
def ZCoverageInvalidB : TestFormat_Op<"variable_invalid_b", [{
type($result) attr-dict
def ZCoverageInvalidE : TestFormat_Op<"variable_invalid_e", [{
attr-dict
}]>, Results<(outs Variadic<I64>:$result)>;
-// CHECK: error: successor #0, named 'successor', not found in custom assembly format
+// CHECK: error: successor #0, named 'successor', not found
// CHECK: note: suggest adding a '$successor' directive to the custom assembly format
def ZCoverageInvalidF : TestFormat_Op<"variable_invalid_f", [{
attr-dict
/// This class implements a simple lexer for operation assembly format strings.
class FormatLexer {
public:
- FormatLexer(llvm::SourceMgr &mgr);
+ FormatLexer(llvm::SourceMgr &mgr, Operator &op);
/// Lex the next token and return it.
Token lexToken();
Token lexVariable(const char *tokStart);
llvm::SourceMgr &srcMgr;
+ Operator &op;
StringRef curBuffer;
const char *curPtr;
};
} // end anonymous namespace
-FormatLexer::FormatLexer(llvm::SourceMgr &mgr) : srcMgr(mgr) {
+FormatLexer::FormatLexer(llvm::SourceMgr &mgr, Operator &op)
+ : srcMgr(mgr), op(op) {
curBuffer = srcMgr.getMemoryBuffer(mgr.getMainFileID())->getBuffer();
curPtr = curBuffer.begin();
}
Token FormatLexer::emitError(llvm::SMLoc loc, const Twine &msg) {
srcMgr.PrintMessage(loc, llvm::SourceMgr::DK_Error, msg);
+ llvm::SrcMgr.PrintMessage(op.getLoc()[0], llvm::SourceMgr::DK_Note,
+ "in custom assembly format for this operation");
return formToken(Token::error, loc.getPointer());
}
Token FormatLexer::emitErrorAndNote(llvm::SMLoc loc, const Twine &msg,
const Twine ¬e) {
srcMgr.PrintMessage(loc, llvm::SourceMgr::DK_Error, msg);
+ llvm::SrcMgr.PrintMessage(op.getLoc()[0], llvm::SourceMgr::DK_Note,
+ "in custom assembly format for this operation");
srcMgr.PrintMessage(loc, llvm::SourceMgr::DK_Note, note);
return formToken(Token::error, loc.getPointer());
}
class FormatParser {
public:
FormatParser(llvm::SourceMgr &mgr, OperationFormat &format, Operator &op)
- : lexer(mgr), curToken(lexer.lexToken()), fmt(format), op(op),
+ : lexer(mgr, op), curToken(lexer.lexToken()), fmt(format), op(op),
seenOperandTypes(op.getNumOperands()),
seenResultTypes(op.getNumResults()) {}
if (!hasAllOperands && !seenOperands.count(&operand)) {
return emitErrorAndNote(loc,
"operand #" + Twine(i) + ", named '" +
- operand.name +
- "', not found in custom assembly format",
+ operand.name + "', not found",
"suggest adding a '$" + operand.name +
"' directive to the custom assembly format");
}
if (!seenSuccessors.count(&successor)) {
return emitErrorAndNote(loc,
"successor #" + Twine(i) + ", named '" +
- successor.name +
- "', not found in custom assembly format",
+ successor.name + "', not found",
"suggest adding a '$" + successor.name +
"' directive to the custom assembly format");
}