#pragma once #include namespace torch::jit { struct Call { std::string fn_name; SourceRange caller_range; }; struct TORCH_API ErrorReport : public std::exception { ErrorReport(const ErrorReport& e); explicit ErrorReport(const SourceRange& r); explicit ErrorReport(const TreeRef& tree) : ErrorReport(tree->range()) {} explicit ErrorReport(const Token& tok) : ErrorReport(tok.range) {} const char* what() const noexcept override; struct TORCH_API CallStack { // These functions are used to report why a function was being compiled // (i.e. what was the call stack of user functions at compilation time that // led to this error) CallStack(const std::string& name, const SourceRange& range); ~CallStack(); // Change the range that is relevant for the current function (i.e. after // each successful expression compilation, change it to the next expression) static void update_pending_range(const SourceRange& range); }; static std::string current_call_stack(); private: template friend const ErrorReport& operator<<(const ErrorReport& e, const T& t); mutable std::stringstream ss; OwnedSourceRange context; mutable std::string the_message; std::vector error_stack; }; template const ErrorReport& operator<<(const ErrorReport& e, const T& t) { e.ss << t; return e; } } // namespace torch::jit