diff --git a/mlir/include/mlir/IR/Diagnostics.h b/mlir/include/mlir/IR/Diagnostics.h --- a/mlir/include/mlir/IR/Diagnostics.h +++ b/mlir/include/mlir/IR/Diagnostics.h @@ -57,7 +57,6 @@ Attribute, Double, Integer, - Operation, String, Type, Unsigned, @@ -84,12 +83,6 @@ return static_cast(opaqueVal); } - /// Returns this argument as an operation. - Operation &getAsOperation() const { - assert(getKind() == DiagnosticArgumentKind::Operation); - return *reinterpret_cast(opaqueVal); - } - /// Returns this argument as a string. StringRef getAsString() const { assert(getKind() == DiagnosticArgumentKind::String); @@ -132,14 +125,6 @@ sizeof(T) <= sizeof(uint64_t)>::type * = 0) : kind(DiagnosticArgumentKind::Unsigned), opaqueVal(uint64_t(val)) {} - // Construct from an operation reference. - explicit DiagnosticArgument(Operation &val) : DiagnosticArgument(&val) {} - explicit DiagnosticArgument(Operation *val) - : kind(DiagnosticArgumentKind::Operation), - opaqueVal(reinterpret_cast(val)) { - assert(val && "expected valid operation"); - } - // Construct from a string reference. explicit DiagnosticArgument(StringRef val) : kind(DiagnosticArgumentKind::String), stringVal(val) {} @@ -229,6 +214,12 @@ /// Stream in an OperationName. Diagnostic &operator<<(OperationName val); + /// Stream in an Operation. + Diagnostic &operator<<(Operation &val); + Diagnostic &operator<<(Operation *val) { + return *this << *val; + } + /// Stream in a range. template Diagnostic &operator<<(iterator_range range) { return appendRange(range); diff --git a/mlir/lib/IR/Diagnostics.cpp b/mlir/lib/IR/Diagnostics.cpp --- a/mlir/lib/IR/Diagnostics.cpp +++ b/mlir/lib/IR/Diagnostics.cpp @@ -36,12 +36,12 @@ // DiagnosticArgument //===----------------------------------------------------------------------===// -// Construct from an Attribute. +/// Construct from an Attribute. DiagnosticArgument::DiagnosticArgument(Attribute attr) : kind(DiagnosticArgumentKind::Attribute), opaqueVal(reinterpret_cast(attr.getAsOpaquePointer())) {} -// Construct from a Type. +/// Construct from a Type. DiagnosticArgument::DiagnosticArgument(Type val) : kind(DiagnosticArgumentKind::Type), opaqueVal(reinterpret_cast(val.getAsOpaquePointer())) {} @@ -71,9 +71,6 @@ case DiagnosticArgumentKind::Integer: os << getAsInteger(); break; - case DiagnosticArgumentKind::Operation: - getAsOperation().print(os, OpPrintingFlags().useLocalScope()); - break; case DiagnosticArgumentKind::String: os << getAsString(); break; @@ -131,6 +128,14 @@ return *this; } +/// Stream in an Operation. +Diagnostic &Diagnostic::operator<<(Operation &val) { + std::string str; + llvm::raw_string_ostream os(str); + os << val; + return *this << os.str(); +} + /// Outputs this diagnostic to a stream. void Diagnostic::print(raw_ostream &os) const { for (auto &arg : getArguments())