summaryrefslogtreecommitdiff
path: root/src/span.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/span.cpp')
-rw-r--r--src/span.cpp35
1 files changed, 21 insertions, 14 deletions
diff --git a/src/span.cpp b/src/span.cpp
index 8d176671..d173ceb7 100644
--- a/src/span.cpp
+++ b/src/span.cpp
@@ -39,31 +39,38 @@ Span::Span():
//filename = FMT(":" << __builtin_return_address(0));
}
+namespace {
+ void print_span_message(const Span& sp, ::std::function<void(::std::ostream&)> tag, ::std::function<void(::std::ostream&)> msg)
+ {
+ auto& sink = ::std::cerr;
+ sink << sp.filename << ":" << sp.start_line << ": ";
+ tag(sink);
+ sink << ":";
+ msg(sink);
+ sink << ::std::endl;
+ const auto* parent = sp.outer_span.get();
+ while(parent)
+ {
+ sink << parent->filename << ":" << parent->start_line << ": note: From here" << ::std::endl;
+ parent = parent->outer_span.get();
+ }
+ }
+}
void Span::bug(::std::function<void(::std::ostream&)> msg) const
{
- ::std::cerr << this->filename << ":" << this->start_line << ": BUG:";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
+ print_span_message(*this, [](auto& os){os << "BUG";}, msg);
abort();
}
void Span::error(ErrorType tag, ::std::function<void(::std::ostream&)> msg) const {
- ::std::cerr << this->filename << ":" << this->start_line << ": error:" << tag <<":";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
+ print_span_message(*this, [&](auto& os){os << "error:" << tag;}, msg);
abort();
}
void Span::warning(WarningType tag, ::std::function<void(::std::ostream&)> msg) const {
- ::std::cerr << this->filename << ":" << this->start_line << ": warning:" << tag << ":";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
- //abort();
+ print_span_message(*this, [&](auto& os){os << "warning" << tag;}, msg);
}
void Span::note(::std::function<void(::std::ostream&)> msg) const {
- ::std::cerr << this->filename << ":" << this->start_line << ": note:";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
- //abort();
+ print_span_message(*this, [](auto& os){os << "note";}, msg);
}
::std::ostream& operator<<(::std::ostream& os, const Span& sp)