xref: /aosp_15_r20/external/pytorch/c10/util/Exception.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #ifndef C10_UTIL_EXCEPTION_H_
2*da0073e9SAndroid Build Coastguard Worker #define C10_UTIL_EXCEPTION_H_
3*da0073e9SAndroid Build Coastguard Worker 
4*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Export.h>
5*da0073e9SAndroid Build Coastguard Worker #include <c10/macros/Macros.h>
6*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Backtrace.h>
7*da0073e9SAndroid Build Coastguard Worker #include <c10/util/Lazy.h>
8*da0073e9SAndroid Build Coastguard Worker #include <c10/util/StringUtil.h>
9*da0073e9SAndroid Build Coastguard Worker 
10*da0073e9SAndroid Build Coastguard Worker #include <cstdint>
11*da0073e9SAndroid Build Coastguard Worker #include <exception>
12*da0073e9SAndroid Build Coastguard Worker #include <memory>
13*da0073e9SAndroid Build Coastguard Worker #include <string>
14*da0073e9SAndroid Build Coastguard Worker #include <variant>
15*da0073e9SAndroid Build Coastguard Worker #include <vector>
16*da0073e9SAndroid Build Coastguard Worker 
17*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER <= 1900
18*da0073e9SAndroid Build Coastguard Worker #define __func__ __FUNCTION__
19*da0073e9SAndroid Build Coastguard Worker #endif
20*da0073e9SAndroid Build Coastguard Worker 
21*da0073e9SAndroid Build Coastguard Worker namespace c10 {
22*da0073e9SAndroid Build Coastguard Worker 
23*da0073e9SAndroid Build Coastguard Worker /// The primary ATen error class.
24*da0073e9SAndroid Build Coastguard Worker /// Provides a complete error message with source location information via
25*da0073e9SAndroid Build Coastguard Worker /// `what()`, and a more concise message via `what_without_backtrace()`.
26*da0073e9SAndroid Build Coastguard Worker /// Don't throw this directly; use TORCH_CHECK/TORCH_INTERNAL_ASSERT instead.
27*da0073e9SAndroid Build Coastguard Worker ///
28*da0073e9SAndroid Build Coastguard Worker /// NB: c10::Error is handled specially by the default torch to suppress the
29*da0073e9SAndroid Build Coastguard Worker /// backtrace, see torch/csrc/Exceptions.h
30*da0073e9SAndroid Build Coastguard Worker class C10_API Error : public std::exception {
31*da0073e9SAndroid Build Coastguard Worker  private:
32*da0073e9SAndroid Build Coastguard Worker   // The actual error message.
33*da0073e9SAndroid Build Coastguard Worker   std::string msg_;
34*da0073e9SAndroid Build Coastguard Worker 
35*da0073e9SAndroid Build Coastguard Worker   // Context for the message (in order of decreasing specificity).  Context will
36*da0073e9SAndroid Build Coastguard Worker   // be automatically formatted appropriately, so it is not necessary to add
37*da0073e9SAndroid Build Coastguard Worker   // extra leading/trailing newlines to strings inside this vector
38*da0073e9SAndroid Build Coastguard Worker   std::vector<std::string> context_;
39*da0073e9SAndroid Build Coastguard Worker 
40*da0073e9SAndroid Build Coastguard Worker   // The C++ backtrace at the point when this exception was raised.  This
41*da0073e9SAndroid Build Coastguard Worker   // may be empty if there is no valid backtrace.  (We don't use optional
42*da0073e9SAndroid Build Coastguard Worker   // here to reduce the dependencies this file has.)
43*da0073e9SAndroid Build Coastguard Worker   Backtrace backtrace_;
44*da0073e9SAndroid Build Coastguard Worker 
45*da0073e9SAndroid Build Coastguard Worker   // These two are derived fields from msg_stack_ and backtrace_, but we need
46*da0073e9SAndroid Build Coastguard Worker   // fields for the strings so that we can return a const char* (as the
47*da0073e9SAndroid Build Coastguard Worker   // signature of std::exception requires).  Currently, the invariant
48*da0073e9SAndroid Build Coastguard Worker   // is that these fields are ALWAYS populated consistently with respect
49*da0073e9SAndroid Build Coastguard Worker   // to msg_stack_ and backtrace_.
50*da0073e9SAndroid Build Coastguard Worker   mutable OptimisticLazy<std::string> what_;
51*da0073e9SAndroid Build Coastguard Worker   std::string what_without_backtrace_;
52*da0073e9SAndroid Build Coastguard Worker 
53*da0073e9SAndroid Build Coastguard Worker   // This is a little debugging trick: you can stash a relevant pointer
54*da0073e9SAndroid Build Coastguard Worker   // in caller, and then when you catch the exception, you can compare
55*da0073e9SAndroid Build Coastguard Worker   // against pointers you have on hand to get more information about
56*da0073e9SAndroid Build Coastguard Worker   // where the exception came from.  In Caffe2, this is used to figure
57*da0073e9SAndroid Build Coastguard Worker   // out which operator raised an exception.
58*da0073e9SAndroid Build Coastguard Worker   const void* caller_;
59*da0073e9SAndroid Build Coastguard Worker 
60*da0073e9SAndroid Build Coastguard Worker  public:
61*da0073e9SAndroid Build Coastguard Worker   // PyTorch-style Error constructor.  NB: the implementation of this
62*da0073e9SAndroid Build Coastguard Worker   // is actually in Logging.cpp
63*da0073e9SAndroid Build Coastguard Worker   Error(SourceLocation source_location, std::string msg);
64*da0073e9SAndroid Build Coastguard Worker 
65*da0073e9SAndroid Build Coastguard Worker   // Caffe2-style error message
66*da0073e9SAndroid Build Coastguard Worker   Error(
67*da0073e9SAndroid Build Coastguard Worker       const char* file,
68*da0073e9SAndroid Build Coastguard Worker       const uint32_t line,
69*da0073e9SAndroid Build Coastguard Worker       const char* condition,
70*da0073e9SAndroid Build Coastguard Worker       const std::string& msg,
71*da0073e9SAndroid Build Coastguard Worker       Backtrace backtrace,
72*da0073e9SAndroid Build Coastguard Worker       const void* caller = nullptr);
73*da0073e9SAndroid Build Coastguard Worker 
74*da0073e9SAndroid Build Coastguard Worker   // Base constructor
75*da0073e9SAndroid Build Coastguard Worker   Error(
76*da0073e9SAndroid Build Coastguard Worker       std::string msg,
77*da0073e9SAndroid Build Coastguard Worker       Backtrace backtrace = nullptr,
78*da0073e9SAndroid Build Coastguard Worker       const void* caller = nullptr);
79*da0073e9SAndroid Build Coastguard Worker 
80*da0073e9SAndroid Build Coastguard Worker   // Add some new context to the message stack.  The last added context
81*da0073e9SAndroid Build Coastguard Worker   // will be formatted at the end of the context list upon printing.
82*da0073e9SAndroid Build Coastguard Worker   // WARNING: This method is O(n) in the size of the stack, so don't go
83*da0073e9SAndroid Build Coastguard Worker   // wild adding a ridiculous amount of context to error messages.
84*da0073e9SAndroid Build Coastguard Worker   void add_context(std::string msg);
85*da0073e9SAndroid Build Coastguard Worker 
msg()86*da0073e9SAndroid Build Coastguard Worker   const std::string& msg() const {
87*da0073e9SAndroid Build Coastguard Worker     return msg_;
88*da0073e9SAndroid Build Coastguard Worker   }
89*da0073e9SAndroid Build Coastguard Worker 
context()90*da0073e9SAndroid Build Coastguard Worker   const std::vector<std::string>& context() const {
91*da0073e9SAndroid Build Coastguard Worker     return context_;
92*da0073e9SAndroid Build Coastguard Worker   }
93*da0073e9SAndroid Build Coastguard Worker 
94*da0073e9SAndroid Build Coastguard Worker   const Backtrace& backtrace() const;
95*da0073e9SAndroid Build Coastguard Worker 
96*da0073e9SAndroid Build Coastguard Worker   /// Returns the complete error message, including the source location.
97*da0073e9SAndroid Build Coastguard Worker   /// The returned pointer is invalidated if you call add_context() on
98*da0073e9SAndroid Build Coastguard Worker   /// this object.
99*da0073e9SAndroid Build Coastguard Worker   const char* what() const noexcept override;
100*da0073e9SAndroid Build Coastguard Worker 
caller()101*da0073e9SAndroid Build Coastguard Worker   const void* caller() const noexcept {
102*da0073e9SAndroid Build Coastguard Worker     return caller_;
103*da0073e9SAndroid Build Coastguard Worker   }
104*da0073e9SAndroid Build Coastguard Worker 
105*da0073e9SAndroid Build Coastguard Worker   /// Returns only the error message string, without source location.
106*da0073e9SAndroid Build Coastguard Worker   /// The returned pointer is invalidated if you call add_context() on
107*da0073e9SAndroid Build Coastguard Worker   /// this object.
what_without_backtrace()108*da0073e9SAndroid Build Coastguard Worker   virtual const char* what_without_backtrace() const noexcept {
109*da0073e9SAndroid Build Coastguard Worker     return what_without_backtrace_.c_str();
110*da0073e9SAndroid Build Coastguard Worker   }
111*da0073e9SAndroid Build Coastguard Worker 
112*da0073e9SAndroid Build Coastguard Worker  private:
113*da0073e9SAndroid Build Coastguard Worker   void refresh_what();
114*da0073e9SAndroid Build Coastguard Worker   std::string compute_what(bool include_backtrace) const;
115*da0073e9SAndroid Build Coastguard Worker };
116*da0073e9SAndroid Build Coastguard Worker 
117*da0073e9SAndroid Build Coastguard Worker class C10_API Warning {
118*da0073e9SAndroid Build Coastguard Worker  public:
119*da0073e9SAndroid Build Coastguard Worker   class C10_API UserWarning {};
120*da0073e9SAndroid Build Coastguard Worker   class C10_API DeprecationWarning {};
121*da0073e9SAndroid Build Coastguard Worker 
122*da0073e9SAndroid Build Coastguard Worker   using warning_variant_t = std::variant<UserWarning, DeprecationWarning>;
123*da0073e9SAndroid Build Coastguard Worker 
124*da0073e9SAndroid Build Coastguard Worker   Warning(
125*da0073e9SAndroid Build Coastguard Worker       warning_variant_t type,
126*da0073e9SAndroid Build Coastguard Worker       const SourceLocation& source_location,
127*da0073e9SAndroid Build Coastguard Worker       std::string msg,
128*da0073e9SAndroid Build Coastguard Worker       bool verbatim);
129*da0073e9SAndroid Build Coastguard Worker 
130*da0073e9SAndroid Build Coastguard Worker   Warning(
131*da0073e9SAndroid Build Coastguard Worker       warning_variant_t type,
132*da0073e9SAndroid Build Coastguard Worker       SourceLocation source_location,
133*da0073e9SAndroid Build Coastguard Worker       const char* msg,
134*da0073e9SAndroid Build Coastguard Worker       bool verbatim);
135*da0073e9SAndroid Build Coastguard Worker 
136*da0073e9SAndroid Build Coastguard Worker   Warning(
137*da0073e9SAndroid Build Coastguard Worker       warning_variant_t type,
138*da0073e9SAndroid Build Coastguard Worker       SourceLocation source_location,
139*da0073e9SAndroid Build Coastguard Worker       ::c10::detail::CompileTimeEmptyString msg,
140*da0073e9SAndroid Build Coastguard Worker       bool verbatim);
141*da0073e9SAndroid Build Coastguard Worker 
142*da0073e9SAndroid Build Coastguard Worker   // Getters for members
143*da0073e9SAndroid Build Coastguard Worker   warning_variant_t type() const;
144*da0073e9SAndroid Build Coastguard Worker   const SourceLocation& source_location() const;
145*da0073e9SAndroid Build Coastguard Worker   const std::string& msg() const;
146*da0073e9SAndroid Build Coastguard Worker   bool verbatim() const;
147*da0073e9SAndroid Build Coastguard Worker 
148*da0073e9SAndroid Build Coastguard Worker  private:
149*da0073e9SAndroid Build Coastguard Worker   // The type of warning
150*da0073e9SAndroid Build Coastguard Worker   warning_variant_t type_;
151*da0073e9SAndroid Build Coastguard Worker 
152*da0073e9SAndroid Build Coastguard Worker   // Where the warning happened.
153*da0073e9SAndroid Build Coastguard Worker   SourceLocation source_location_;
154*da0073e9SAndroid Build Coastguard Worker 
155*da0073e9SAndroid Build Coastguard Worker   // The actual warning message.
156*da0073e9SAndroid Build Coastguard Worker   std::string msg_;
157*da0073e9SAndroid Build Coastguard Worker 
158*da0073e9SAndroid Build Coastguard Worker   // See note: [Verbatim Warnings]
159*da0073e9SAndroid Build Coastguard Worker   bool verbatim_;
160*da0073e9SAndroid Build Coastguard Worker };
161*da0073e9SAndroid Build Coastguard Worker 
162*da0073e9SAndroid Build Coastguard Worker using UserWarning = Warning::UserWarning;
163*da0073e9SAndroid Build Coastguard Worker using DeprecationWarning = Warning::DeprecationWarning;
164*da0073e9SAndroid Build Coastguard Worker 
165*da0073e9SAndroid Build Coastguard Worker // Issue a warning with a given message. Dispatched to the current
166*da0073e9SAndroid Build Coastguard Worker // warning handler.
167*da0073e9SAndroid Build Coastguard Worker void C10_API warn(const Warning& warning);
168*da0073e9SAndroid Build Coastguard Worker 
169*da0073e9SAndroid Build Coastguard Worker class C10_API WarningHandler {
170*da0073e9SAndroid Build Coastguard Worker  public:
171*da0073e9SAndroid Build Coastguard Worker   virtual ~WarningHandler() = default;
172*da0073e9SAndroid Build Coastguard Worker   /// The default warning handler. Prints the message to stderr.
173*da0073e9SAndroid Build Coastguard Worker   virtual void process(const Warning& warning);
174*da0073e9SAndroid Build Coastguard Worker };
175*da0073e9SAndroid Build Coastguard Worker 
176*da0073e9SAndroid Build Coastguard Worker namespace WarningUtils {
177*da0073e9SAndroid Build Coastguard Worker 
178*da0073e9SAndroid Build Coastguard Worker // Note: [Verbatim Warnings]
179*da0073e9SAndroid Build Coastguard Worker // Warnings originating in C++ code can appear out-of-place to Python users:
180*da0073e9SAndroid Build Coastguard Worker // a user runs a line in Python, but the warning references a line in C++.
181*da0073e9SAndroid Build Coastguard Worker // Some parts of PyTorch, like the JIT, are cognizant of this mismatch
182*da0073e9SAndroid Build Coastguard Worker // and take care to map warnings back to the user's program, but most
183*da0073e9SAndroid Build Coastguard Worker // of PyTorch simply throws a context-free warning. To allow warning
184*da0073e9SAndroid Build Coastguard Worker // handlers to add context where appropriate, warn takes the
185*da0073e9SAndroid Build Coastguard Worker // "verbatim" flag. When this is false a warning handler might append
186*da0073e9SAndroid Build Coastguard Worker // the C++ warning to a Python warning message that relates the warning
187*da0073e9SAndroid Build Coastguard Worker // back to the user's program. Callers who have already accounted for
188*da0073e9SAndroid Build Coastguard Worker // context in their warnings should set verbatim to true so their warnings
189*da0073e9SAndroid Build Coastguard Worker // appear without modification.
190*da0073e9SAndroid Build Coastguard Worker 
191*da0073e9SAndroid Build Coastguard Worker /// Sets the global warning handler. This is not thread-safe, so it should
192*da0073e9SAndroid Build Coastguard Worker /// generally be called once during initialization or while holding the GIL
193*da0073e9SAndroid Build Coastguard Worker /// for programs that use python.
194*da0073e9SAndroid Build Coastguard Worker /// User is responsible for keeping the WarningHandler alive until
195*da0073e9SAndroid Build Coastguard Worker /// it is not needed.
196*da0073e9SAndroid Build Coastguard Worker C10_API void set_warning_handler(WarningHandler* handler) noexcept(true);
197*da0073e9SAndroid Build Coastguard Worker /// Gets the global warning handler.
198*da0073e9SAndroid Build Coastguard Worker C10_API WarningHandler* get_warning_handler() noexcept(true);
199*da0073e9SAndroid Build Coastguard Worker 
200*da0073e9SAndroid Build Coastguard Worker class C10_API WarningHandlerGuard {
201*da0073e9SAndroid Build Coastguard Worker   WarningHandler* prev_handler_;
202*da0073e9SAndroid Build Coastguard Worker 
203*da0073e9SAndroid Build Coastguard Worker  public:
WarningHandlerGuard(WarningHandler * new_handler)204*da0073e9SAndroid Build Coastguard Worker   WarningHandlerGuard(WarningHandler* new_handler)
205*da0073e9SAndroid Build Coastguard Worker       : prev_handler_(c10::WarningUtils::get_warning_handler()) {
206*da0073e9SAndroid Build Coastguard Worker     c10::WarningUtils::set_warning_handler(new_handler);
207*da0073e9SAndroid Build Coastguard Worker   }
~WarningHandlerGuard()208*da0073e9SAndroid Build Coastguard Worker   ~WarningHandlerGuard() {
209*da0073e9SAndroid Build Coastguard Worker     c10::WarningUtils::set_warning_handler(prev_handler_);
210*da0073e9SAndroid Build Coastguard Worker   }
211*da0073e9SAndroid Build Coastguard Worker };
212*da0073e9SAndroid Build Coastguard Worker 
213*da0073e9SAndroid Build Coastguard Worker /// The TORCH_WARN_ONCE macro is difficult to test for. Use
214*da0073e9SAndroid Build Coastguard Worker /// setWarnAlways(true) to turn it into TORCH_WARN, which can be
215*da0073e9SAndroid Build Coastguard Worker /// tested for more easily.
216*da0073e9SAndroid Build Coastguard Worker C10_API void set_warnAlways(bool) noexcept(true);
217*da0073e9SAndroid Build Coastguard Worker C10_API bool get_warnAlways() noexcept(true);
218*da0073e9SAndroid Build Coastguard Worker 
219*da0073e9SAndroid Build Coastguard Worker // A RAII guard that sets warn_always (not thread-local) on
220*da0073e9SAndroid Build Coastguard Worker // construction, and sets it back to the original value upon destruction.
221*da0073e9SAndroid Build Coastguard Worker struct C10_API WarnAlways {
222*da0073e9SAndroid Build Coastguard Worker  public:
223*da0073e9SAndroid Build Coastguard Worker   explicit WarnAlways(bool setting = true);
224*da0073e9SAndroid Build Coastguard Worker   ~WarnAlways();
225*da0073e9SAndroid Build Coastguard Worker 
226*da0073e9SAndroid Build Coastguard Worker  private:
227*da0073e9SAndroid Build Coastguard Worker   bool prev_setting;
228*da0073e9SAndroid Build Coastguard Worker };
229*da0073e9SAndroid Build Coastguard Worker 
230*da0073e9SAndroid Build Coastguard Worker } // namespace WarningUtils
231*da0073e9SAndroid Build Coastguard Worker 
232*da0073e9SAndroid Build Coastguard Worker // Like Error, but we always report the C++ backtrace, instead of only
233*da0073e9SAndroid Build Coastguard Worker // reporting when TORCH_SHOW_CPP_STACKTRACES
234*da0073e9SAndroid Build Coastguard Worker class C10_API ErrorAlwaysShowCppStacktrace : public Error {
235*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
what_without_backtrace()236*da0073e9SAndroid Build Coastguard Worker   const char* what_without_backtrace() const noexcept override {
237*da0073e9SAndroid Build Coastguard Worker     return what();
238*da0073e9SAndroid Build Coastguard Worker   }
239*da0073e9SAndroid Build Coastguard Worker };
240*da0073e9SAndroid Build Coastguard Worker 
241*da0073e9SAndroid Build Coastguard Worker // Used in ATen for out-of-bound indices that can reasonably only be detected
242*da0073e9SAndroid Build Coastguard Worker // lazily inside a kernel (See: advanced indexing).  These turn into
243*da0073e9SAndroid Build Coastguard Worker // IndexError when they cross to Python.
244*da0073e9SAndroid Build Coastguard Worker class C10_API IndexError : public Error {
245*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
246*da0073e9SAndroid Build Coastguard Worker };
247*da0073e9SAndroid Build Coastguard Worker 
248*da0073e9SAndroid Build Coastguard Worker // Used in ATen for invalid values.  These turn into
249*da0073e9SAndroid Build Coastguard Worker // ValueError when they cross to Python.
250*da0073e9SAndroid Build Coastguard Worker class C10_API ValueError : public Error {
251*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
252*da0073e9SAndroid Build Coastguard Worker };
253*da0073e9SAndroid Build Coastguard Worker 
254*da0073e9SAndroid Build Coastguard Worker // Used in ATen for invalid types.  These turn into
255*da0073e9SAndroid Build Coastguard Worker // TypeError when they cross to Python.
256*da0073e9SAndroid Build Coastguard Worker class C10_API TypeError : public Error {
257*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
258*da0073e9SAndroid Build Coastguard Worker };
259*da0073e9SAndroid Build Coastguard Worker 
260*da0073e9SAndroid Build Coastguard Worker // Used in ATen for functionality that is not implemented.  These turn into
261*da0073e9SAndroid Build Coastguard Worker // NotImplementedError when they cross to Python.
262*da0073e9SAndroid Build Coastguard Worker class C10_API NotImplementedError : public Error {
263*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
264*da0073e9SAndroid Build Coastguard Worker };
265*da0073e9SAndroid Build Coastguard Worker 
266*da0073e9SAndroid Build Coastguard Worker // Used in ATen for non finite indices.  These turn into
267*da0073e9SAndroid Build Coastguard Worker // ExitException when they cross to Python.
268*da0073e9SAndroid Build Coastguard Worker class C10_API EnforceFiniteError : public Error {
269*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
270*da0073e9SAndroid Build Coastguard Worker };
271*da0073e9SAndroid Build Coastguard Worker 
272*da0073e9SAndroid Build Coastguard Worker // Used in Onnxifi backend lowering.  These turn into
273*da0073e9SAndroid Build Coastguard Worker // ExitException when they cross to Python.
274*da0073e9SAndroid Build Coastguard Worker class C10_API OnnxfiBackendSystemError : public Error {
275*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
276*da0073e9SAndroid Build Coastguard Worker };
277*da0073e9SAndroid Build Coastguard Worker 
278*da0073e9SAndroid Build Coastguard Worker // Used for numerical errors from the linalg module. These
279*da0073e9SAndroid Build Coastguard Worker // turn into LinAlgError when they cross into Python.
280*da0073e9SAndroid Build Coastguard Worker class C10_API LinAlgError : public Error {
281*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
282*da0073e9SAndroid Build Coastguard Worker };
283*da0073e9SAndroid Build Coastguard Worker 
284*da0073e9SAndroid Build Coastguard Worker class C10_API OutOfMemoryError : public Error {
285*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
286*da0073e9SAndroid Build Coastguard Worker };
287*da0073e9SAndroid Build Coastguard Worker 
288*da0073e9SAndroid Build Coastguard Worker // Base error type for all distributed errors.
289*da0073e9SAndroid Build Coastguard Worker // These turn into DistError when they cross into Python.
290*da0073e9SAndroid Build Coastguard Worker class C10_API DistError : public Error {
291*da0073e9SAndroid Build Coastguard Worker   using Error::Error;
292*da0073e9SAndroid Build Coastguard Worker };
293*da0073e9SAndroid Build Coastguard Worker 
294*da0073e9SAndroid Build Coastguard Worker // Used for collective communication library errors from the distributed module.
295*da0073e9SAndroid Build Coastguard Worker // These turn into DistBackendError when they cross into Python.
296*da0073e9SAndroid Build Coastguard Worker class C10_API DistBackendError : public DistError {
297*da0073e9SAndroid Build Coastguard Worker   using DistError::DistError;
298*da0073e9SAndroid Build Coastguard Worker };
299*da0073e9SAndroid Build Coastguard Worker 
300*da0073e9SAndroid Build Coastguard Worker // Used for errors originating from the store.
301*da0073e9SAndroid Build Coastguard Worker // These turn into DistStoreError when they cross into Python.
302*da0073e9SAndroid Build Coastguard Worker class C10_API DistStoreError : public DistError {
303*da0073e9SAndroid Build Coastguard Worker   using DistError::DistError;
304*da0073e9SAndroid Build Coastguard Worker };
305*da0073e9SAndroid Build Coastguard Worker 
306*da0073e9SAndroid Build Coastguard Worker // Used for errors originating from the TCP/IP stack and not from collective
307*da0073e9SAndroid Build Coastguard Worker // libraries. These turn into DistNetworkError when they cross into Python.
308*da0073e9SAndroid Build Coastguard Worker class C10_API DistNetworkError : public DistError {
309*da0073e9SAndroid Build Coastguard Worker   using DistError::DistError;
310*da0073e9SAndroid Build Coastguard Worker };
311*da0073e9SAndroid Build Coastguard Worker 
312*da0073e9SAndroid Build Coastguard Worker // A utility function to return an exception std::string by prepending its
313*da0073e9SAndroid Build Coastguard Worker // exception type before its what() content
314*da0073e9SAndroid Build Coastguard Worker C10_API std::string GetExceptionString(const std::exception& e);
315*da0073e9SAndroid Build Coastguard Worker 
316*da0073e9SAndroid Build Coastguard Worker } // namespace c10
317*da0073e9SAndroid Build Coastguard Worker 
318*da0073e9SAndroid Build Coastguard Worker // Private helper macro for implementing TORCH_INTERNAL_ASSERT and TORCH_CHECK
319*da0073e9SAndroid Build Coastguard Worker //
320*da0073e9SAndroid Build Coastguard Worker // Note: In the debug build With MSVC, __LINE__ might be of long type (a.k.a
321*da0073e9SAndroid Build Coastguard Worker // int32_t), which is different from the definition of `SourceLocation` that
322*da0073e9SAndroid Build Coastguard Worker // requires unsigned int (a.k.a uint32_t) and may cause a compile error with the
323*da0073e9SAndroid Build Coastguard Worker // message: error C2397: conversion from 'long' to 'uint32_t' requires a
324*da0073e9SAndroid Build Coastguard Worker // narrowing conversion Here the static cast is used to pass the build. if this
325*da0073e9SAndroid Build Coastguard Worker // is used inside a lambda the __func__ macro expands to operator(), which isn't
326*da0073e9SAndroid Build Coastguard Worker // very useful, but hard to fix in a macro so suppressing the warning.
327*da0073e9SAndroid Build Coastguard Worker #define C10_THROW_ERROR(err_type, msg) \
328*da0073e9SAndroid Build Coastguard Worker   throw ::c10::err_type(               \
329*da0073e9SAndroid Build Coastguard Worker       {__func__, __FILE__, static_cast<uint32_t>(__LINE__)}, msg)
330*da0073e9SAndroid Build Coastguard Worker 
331*da0073e9SAndroid Build Coastguard Worker #define C10_BUILD_ERROR(err_type, msg) \
332*da0073e9SAndroid Build Coastguard Worker   ::c10::err_type({__func__, __FILE__, static_cast<uint32_t>(__LINE__)}, msg)
333*da0073e9SAndroid Build Coastguard Worker 
334*da0073e9SAndroid Build Coastguard Worker // Private helper macro for workaround MSVC misexpansion of nested macro
335*da0073e9SAndroid Build Coastguard Worker // invocations involving __VA_ARGS__.  See
336*da0073e9SAndroid Build Coastguard Worker // https://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly
337*da0073e9SAndroid Build Coastguard Worker #define C10_EXPAND_MSVC_WORKAROUND(x) x
338*da0073e9SAndroid Build Coastguard Worker 
339*da0073e9SAndroid Build Coastguard Worker // On nvcc, C10_UNLIKELY thwarts missing return statement analysis.  In cases
340*da0073e9SAndroid Build Coastguard Worker // where the unlikely expression may be a constant, use this macro to ensure
341*da0073e9SAndroid Build Coastguard Worker // return statement analysis keeps working (at the cost of not getting the
342*da0073e9SAndroid Build Coastguard Worker // likely/unlikely annotation on nvcc).
343*da0073e9SAndroid Build Coastguard Worker // https://github.com/pytorch/pytorch/issues/21418
344*da0073e9SAndroid Build Coastguard Worker //
345*da0073e9SAndroid Build Coastguard Worker // Currently, this is only used in the error reporting macros below.  If you
346*da0073e9SAndroid Build Coastguard Worker // want to use it more generally, move me to Macros.h
347*da0073e9SAndroid Build Coastguard Worker //
348*da0073e9SAndroid Build Coastguard Worker // TODO: Brian Vaughan observed that we might be able to get this to work on
349*da0073e9SAndroid Build Coastguard Worker // nvcc by writing some sort of C++ overload that distinguishes constexpr inputs
350*da0073e9SAndroid Build Coastguard Worker // from non-constexpr.  Since there isn't any evidence that losing C10_UNLIKELY
351*da0073e9SAndroid Build Coastguard Worker // in nvcc is causing us perf problems, this is not yet implemented, but this
352*da0073e9SAndroid Build Coastguard Worker // might be an interesting piece of C++ code for an intrepid bootcamper to
353*da0073e9SAndroid Build Coastguard Worker // write.
354*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDACC__)
355*da0073e9SAndroid Build Coastguard Worker #define C10_UNLIKELY_OR_CONST(e) e
356*da0073e9SAndroid Build Coastguard Worker #else
357*da0073e9SAndroid Build Coastguard Worker #define C10_UNLIKELY_OR_CONST(e) C10_UNLIKELY(e)
358*da0073e9SAndroid Build Coastguard Worker #endif
359*da0073e9SAndroid Build Coastguard Worker 
360*da0073e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
361*da0073e9SAndroid Build Coastguard Worker // Error reporting macros
362*da0073e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
363*da0073e9SAndroid Build Coastguard Worker 
364*da0073e9SAndroid Build Coastguard Worker #ifdef STRIP_ERROR_MESSAGES
365*da0073e9SAndroid Build Coastguard Worker #define TORCH_RETHROW(e, ...) throw
366*da0073e9SAndroid Build Coastguard Worker #else
367*da0073e9SAndroid Build Coastguard Worker #define TORCH_RETHROW(e, ...)               \
368*da0073e9SAndroid Build Coastguard Worker   do {                                      \
369*da0073e9SAndroid Build Coastguard Worker     e.add_context(::c10::str(__VA_ARGS__)); \
370*da0073e9SAndroid Build Coastguard Worker     throw;                                  \
371*da0073e9SAndroid Build Coastguard Worker   } while (false)
372*da0073e9SAndroid Build Coastguard Worker #endif
373*da0073e9SAndroid Build Coastguard Worker 
374*da0073e9SAndroid Build Coastguard Worker // A utility macro to provide assert()-like functionality; that is, enforcement
375*da0073e9SAndroid Build Coastguard Worker // of internal invariants in code.  It supports an arbitrary number of extra
376*da0073e9SAndroid Build Coastguard Worker // arguments (evaluated only on failure), which will be printed in the assert
377*da0073e9SAndroid Build Coastguard Worker // failure message using operator<< (this is useful to print some variables
378*da0073e9SAndroid Build Coastguard Worker // which may be useful for debugging.)
379*da0073e9SAndroid Build Coastguard Worker //
380*da0073e9SAndroid Build Coastguard Worker // Usage:
381*da0073e9SAndroid Build Coastguard Worker //    TORCH_INTERNAL_ASSERT(should_be_true);
382*da0073e9SAndroid Build Coastguard Worker //    TORCH_INTERNAL_ASSERT(x == 0, "x = ", x);
383*da0073e9SAndroid Build Coastguard Worker //
384*da0073e9SAndroid Build Coastguard Worker // Assuming no bugs in PyTorch, the conditions tested by this macro should
385*da0073e9SAndroid Build Coastguard Worker // always be true; e.g., it should be possible to disable all of these
386*da0073e9SAndroid Build Coastguard Worker // conditions without changing observable user behavior.  If you would like to
387*da0073e9SAndroid Build Coastguard Worker // do error reporting for user input, please use TORCH_CHECK instead.
388*da0073e9SAndroid Build Coastguard Worker //
389*da0073e9SAndroid Build Coastguard Worker // NOTE: It is SAFE to use this macro in production code; on failure, this
390*da0073e9SAndroid Build Coastguard Worker // simply raises an exception, it does NOT unceremoniously quit the process
391*da0073e9SAndroid Build Coastguard Worker // (unlike assert()).
392*da0073e9SAndroid Build Coastguard Worker //
393*da0073e9SAndroid Build Coastguard Worker #ifdef STRIP_ERROR_MESSAGES
394*da0073e9SAndroid Build Coastguard Worker #define TORCH_INTERNAL_ASSERT(cond, ...)                              \
395*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY_OR_CONST(!(cond))) {                               \
396*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::torchCheckFail(                                    \
397*da0073e9SAndroid Build Coastguard Worker         __func__,                                                     \
398*da0073e9SAndroid Build Coastguard Worker         __FILE__,                                                     \
399*da0073e9SAndroid Build Coastguard Worker         static_cast<uint32_t>(__LINE__),                              \
400*da0073e9SAndroid Build Coastguard Worker         #cond " INTERNAL ASSERT FAILED at " C10_STRINGIZE(__FILE__)); \
401*da0073e9SAndroid Build Coastguard Worker   }
402*da0073e9SAndroid Build Coastguard Worker #else
403*da0073e9SAndroid Build Coastguard Worker // It would be nice if we could build a combined string literal out of
404*da0073e9SAndroid Build Coastguard Worker // the TORCH_INTERNAL_ASSERT prefix and a user-provided string literal
405*da0073e9SAndroid Build Coastguard Worker // as the first argument, but there doesn't seem to be any good way to
406*da0073e9SAndroid Build Coastguard Worker // do that while still supporting having a first argument that isn't a
407*da0073e9SAndroid Build Coastguard Worker // string literal.
408*da0073e9SAndroid Build Coastguard Worker #define TORCH_INTERNAL_ASSERT(cond, ...)                                         \
409*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY_OR_CONST(!(cond))) {                                          \
410*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::torchInternalAssertFail(                                      \
411*da0073e9SAndroid Build Coastguard Worker         __func__,                                                                \
412*da0073e9SAndroid Build Coastguard Worker         __FILE__,                                                                \
413*da0073e9SAndroid Build Coastguard Worker         static_cast<uint32_t>(__LINE__),                                         \
414*da0073e9SAndroid Build Coastguard Worker         #cond                                                                    \
415*da0073e9SAndroid Build Coastguard Worker         " INTERNAL ASSERT FAILED at " C10_STRINGIZE(__FILE__) ":" C10_STRINGIZE( \
416*da0073e9SAndroid Build Coastguard Worker             __LINE__) ", please report a bug to PyTorch. ",                      \
417*da0073e9SAndroid Build Coastguard Worker         c10::str(__VA_ARGS__));                                                  \
418*da0073e9SAndroid Build Coastguard Worker   }
419*da0073e9SAndroid Build Coastguard Worker #endif
420*da0073e9SAndroid Build Coastguard Worker 
421*da0073e9SAndroid Build Coastguard Worker // A utility macro to make it easier to test for error conditions from user
422*da0073e9SAndroid Build Coastguard Worker // input.  Like TORCH_INTERNAL_ASSERT, it supports an arbitrary number of extra
423*da0073e9SAndroid Build Coastguard Worker // arguments (evaluated only on failure), which will be printed in the error
424*da0073e9SAndroid Build Coastguard Worker // message using operator<< (e.g., you can pass any object which has
425*da0073e9SAndroid Build Coastguard Worker // operator<< defined.  Most objects in PyTorch have these definitions!)
426*da0073e9SAndroid Build Coastguard Worker //
427*da0073e9SAndroid Build Coastguard Worker // Usage:
428*da0073e9SAndroid Build Coastguard Worker //    TORCH_CHECK(should_be_true); // A default error message will be provided
429*da0073e9SAndroid Build Coastguard Worker //                                 // in this case; but we recommend writing an
430*da0073e9SAndroid Build Coastguard Worker //                                 // explicit error message, as it is more
431*da0073e9SAndroid Build Coastguard Worker //                                 // user friendly.
432*da0073e9SAndroid Build Coastguard Worker //    TORCH_CHECK(x == 0, "Expected x to be 0, but got ", x);
433*da0073e9SAndroid Build Coastguard Worker //
434*da0073e9SAndroid Build Coastguard Worker // On failure, this macro will raise an exception.  If this exception propagates
435*da0073e9SAndroid Build Coastguard Worker // to Python, it will convert into a Python RuntimeError.
436*da0073e9SAndroid Build Coastguard Worker //
437*da0073e9SAndroid Build Coastguard Worker // NOTE: It is SAFE to use this macro in production code; on failure, this
438*da0073e9SAndroid Build Coastguard Worker // simply raises an exception, it does NOT unceremoniously quit the process
439*da0073e9SAndroid Build Coastguard Worker // (unlike CHECK() from glog.)
440*da0073e9SAndroid Build Coastguard Worker //
441*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_WITH(error_t, cond, ...) \
442*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK_WITH_MSG(error_t, cond, "", __VA_ARGS__)
443*da0073e9SAndroid Build Coastguard Worker 
444*da0073e9SAndroid Build Coastguard Worker #ifdef STRIP_ERROR_MESSAGES
445*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_MSG(cond, type, ...) \
446*da0073e9SAndroid Build Coastguard Worker   (#cond #type " CHECK FAILED at " C10_STRINGIZE(__FILE__))
447*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_WITH_MSG(error_t, cond, type, ...)                \
448*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY_OR_CONST(!(cond))) {                               \
449*da0073e9SAndroid Build Coastguard Worker     C10_THROW_ERROR(Error, TORCH_CHECK_MSG(cond, type, __VA_ARGS__)); \
450*da0073e9SAndroid Build Coastguard Worker   }
451*da0073e9SAndroid Build Coastguard Worker #else
452*da0073e9SAndroid Build Coastguard Worker 
453*da0073e9SAndroid Build Coastguard Worker namespace c10::detail {
454*da0073e9SAndroid Build Coastguard Worker template <typename... Args>
decltype(auto)455*da0073e9SAndroid Build Coastguard Worker decltype(auto) torchCheckMsgImpl(const char* /*msg*/, const Args&... args) {
456*da0073e9SAndroid Build Coastguard Worker   return ::c10::str(args...);
457*da0073e9SAndroid Build Coastguard Worker }
torchCheckMsgImpl(const char * msg)458*da0073e9SAndroid Build Coastguard Worker inline C10_API const char* torchCheckMsgImpl(const char* msg) {
459*da0073e9SAndroid Build Coastguard Worker   return msg;
460*da0073e9SAndroid Build Coastguard Worker }
461*da0073e9SAndroid Build Coastguard Worker // If there is just 1 user-provided C-string argument, use it.
torchCheckMsgImpl(const char *,const char * args)462*da0073e9SAndroid Build Coastguard Worker inline C10_API const char* torchCheckMsgImpl(
463*da0073e9SAndroid Build Coastguard Worker     const char* /*msg*/,
464*da0073e9SAndroid Build Coastguard Worker     const char* args) {
465*da0073e9SAndroid Build Coastguard Worker   return args;
466*da0073e9SAndroid Build Coastguard Worker }
467*da0073e9SAndroid Build Coastguard Worker } // namespace c10::detail
468*da0073e9SAndroid Build Coastguard Worker 
469*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_MSG(cond, type, ...)                   \
470*da0073e9SAndroid Build Coastguard Worker   (::c10::detail::torchCheckMsgImpl(                       \
471*da0073e9SAndroid Build Coastguard Worker       "Expected " #cond                                    \
472*da0073e9SAndroid Build Coastguard Worker       " to be true, but got false.  "                      \
473*da0073e9SAndroid Build Coastguard Worker       "(Could this error message be improved?  If so, "    \
474*da0073e9SAndroid Build Coastguard Worker       "please report an enhancement request to PyTorch.)", \
475*da0073e9SAndroid Build Coastguard Worker       ##__VA_ARGS__))
476*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_WITH_MSG(error_t, cond, type, ...)                  \
477*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY_OR_CONST(!(cond))) {                                 \
478*da0073e9SAndroid Build Coastguard Worker     C10_THROW_ERROR(error_t, TORCH_CHECK_MSG(cond, type, __VA_ARGS__)); \
479*da0073e9SAndroid Build Coastguard Worker   }
480*da0073e9SAndroid Build Coastguard Worker #endif
481*da0073e9SAndroid Build Coastguard Worker 
482*da0073e9SAndroid Build Coastguard Worker namespace c10::detail {
483*da0073e9SAndroid Build Coastguard Worker 
484*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void torchCheckFail(
485*da0073e9SAndroid Build Coastguard Worker     const char* func,
486*da0073e9SAndroid Build Coastguard Worker     const char* file,
487*da0073e9SAndroid Build Coastguard Worker     uint32_t line,
488*da0073e9SAndroid Build Coastguard Worker     const std::string& msg);
489*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void torchCheckFail(
490*da0073e9SAndroid Build Coastguard Worker     const char* func,
491*da0073e9SAndroid Build Coastguard Worker     const char* file,
492*da0073e9SAndroid Build Coastguard Worker     uint32_t line,
493*da0073e9SAndroid Build Coastguard Worker     const char* msg);
494*da0073e9SAndroid Build Coastguard Worker 
495*da0073e9SAndroid Build Coastguard Worker // The c10::str() call that creates userMsg can have 1 of 3 return
496*da0073e9SAndroid Build Coastguard Worker // types depending on the number and types of arguments passed to
497*da0073e9SAndroid Build Coastguard Worker // TORCH_INTERNAL_ASSERT.  0 arguments will get a
498*da0073e9SAndroid Build Coastguard Worker // CompileTimeEmptyString, 1 const char * will be passed straight
499*da0073e9SAndroid Build Coastguard Worker // through, and anything else will get converted to std::string.
500*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void torchInternalAssertFail(
501*da0073e9SAndroid Build Coastguard Worker     const char* func,
502*da0073e9SAndroid Build Coastguard Worker     const char* file,
503*da0073e9SAndroid Build Coastguard Worker     uint32_t line,
504*da0073e9SAndroid Build Coastguard Worker     const char* condMsg,
505*da0073e9SAndroid Build Coastguard Worker     const char* userMsg);
torchInternalAssertFail(const char * func,const char * file,uint32_t line,const char * condMsg,::c10::detail::CompileTimeEmptyString)506*da0073e9SAndroid Build Coastguard Worker [[noreturn]] inline C10_API void torchInternalAssertFail(
507*da0073e9SAndroid Build Coastguard Worker     const char* func,
508*da0073e9SAndroid Build Coastguard Worker     const char* file,
509*da0073e9SAndroid Build Coastguard Worker     uint32_t line,
510*da0073e9SAndroid Build Coastguard Worker     const char* condMsg,
511*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::CompileTimeEmptyString /*userMsg*/) {
512*da0073e9SAndroid Build Coastguard Worker   torchCheckFail(func, file, line, condMsg);
513*da0073e9SAndroid Build Coastguard Worker }
514*da0073e9SAndroid Build Coastguard Worker [[noreturn]] C10_API void torchInternalAssertFail(
515*da0073e9SAndroid Build Coastguard Worker     const char* func,
516*da0073e9SAndroid Build Coastguard Worker     const char* file,
517*da0073e9SAndroid Build Coastguard Worker     uint32_t line,
518*da0073e9SAndroid Build Coastguard Worker     const char* condMsg,
519*da0073e9SAndroid Build Coastguard Worker     const std::string& userMsg);
520*da0073e9SAndroid Build Coastguard Worker 
521*da0073e9SAndroid Build Coastguard Worker } // namespace c10::detail
522*da0073e9SAndroid Build Coastguard Worker 
523*da0073e9SAndroid Build Coastguard Worker #ifdef STRIP_ERROR_MESSAGES
524*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK(cond, ...)                   \
525*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY_OR_CONST(!(cond))) {          \
526*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::torchCheckFail(               \
527*da0073e9SAndroid Build Coastguard Worker         __func__,                                \
528*da0073e9SAndroid Build Coastguard Worker         __FILE__,                                \
529*da0073e9SAndroid Build Coastguard Worker         static_cast<uint32_t>(__LINE__),         \
530*da0073e9SAndroid Build Coastguard Worker         TORCH_CHECK_MSG(cond, "", __VA_ARGS__)); \
531*da0073e9SAndroid Build Coastguard Worker   }
532*da0073e9SAndroid Build Coastguard Worker #else
533*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK(cond, ...)                     \
534*da0073e9SAndroid Build Coastguard Worker   if (C10_UNLIKELY_OR_CONST(!(cond))) {            \
535*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::torchCheckFail(                 \
536*da0073e9SAndroid Build Coastguard Worker         __func__,                                  \
537*da0073e9SAndroid Build Coastguard Worker         __FILE__,                                  \
538*da0073e9SAndroid Build Coastguard Worker         static_cast<uint32_t>(__LINE__),           \
539*da0073e9SAndroid Build Coastguard Worker         TORCH_CHECK_MSG(cond, "", ##__VA_ARGS__)); \
540*da0073e9SAndroid Build Coastguard Worker   }
541*da0073e9SAndroid Build Coastguard Worker #endif
542*da0073e9SAndroid Build Coastguard Worker 
543*da0073e9SAndroid Build Coastguard Worker // An utility macro that does what `TORCH_CHECK` does if compiled in the host
544*da0073e9SAndroid Build Coastguard Worker // code, otherwise does nothing. Supposed to be used in the code shared between
545*da0073e9SAndroid Build Coastguard Worker // host and device code as an alternative for `TORCH_CHECK`.
546*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDACC__) || defined(__HIPCC__)
547*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_IF_NOT_ON_CUDA(cond, ...)
548*da0073e9SAndroid Build Coastguard Worker #else
549*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_IF_NOT_ON_CUDA(cond, ...) TORCH_CHECK(cond, ##__VA_ARGS__)
550*da0073e9SAndroid Build Coastguard Worker #endif
551*da0073e9SAndroid Build Coastguard Worker 
552*da0073e9SAndroid Build Coastguard Worker // Debug only version of TORCH_INTERNAL_ASSERT. This macro only checks in debug
553*da0073e9SAndroid Build Coastguard Worker // build, and does nothing in release build.  It is appropriate to use
554*da0073e9SAndroid Build Coastguard Worker // in situations where you want to add an assert to a hotpath, but it is
555*da0073e9SAndroid Build Coastguard Worker // too expensive to run this assert on production builds.
556*da0073e9SAndroid Build Coastguard Worker #ifdef NDEBUG
557*da0073e9SAndroid Build Coastguard Worker // Optimized version - generates no code.
558*da0073e9SAndroid Build Coastguard Worker #define TORCH_INTERNAL_ASSERT_DEBUG_ONLY(...) \
559*da0073e9SAndroid Build Coastguard Worker   while (false)                               \
560*da0073e9SAndroid Build Coastguard Worker   C10_EXPAND_MSVC_WORKAROUND(TORCH_INTERNAL_ASSERT(__VA_ARGS__))
561*da0073e9SAndroid Build Coastguard Worker #else
562*da0073e9SAndroid Build Coastguard Worker #define TORCH_INTERNAL_ASSERT_DEBUG_ONLY(...) \
563*da0073e9SAndroid Build Coastguard Worker   C10_EXPAND_MSVC_WORKAROUND(TORCH_INTERNAL_ASSERT(__VA_ARGS__))
564*da0073e9SAndroid Build Coastguard Worker #endif
565*da0073e9SAndroid Build Coastguard Worker 
566*da0073e9SAndroid Build Coastguard Worker // TODO: We're going to get a lot of similar looking string literals
567*da0073e9SAndroid Build Coastguard Worker // this way; check if this actually affects binary size.
568*da0073e9SAndroid Build Coastguard Worker 
569*da0073e9SAndroid Build Coastguard Worker // Like TORCH_CHECK, but raises LinAlgError instead of Error.
570*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_LINALG(cond, ...) \
571*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK_WITH_MSG(LinAlgError, cond, "LINALG", __VA_ARGS__)
572*da0073e9SAndroid Build Coastguard Worker 
573*da0073e9SAndroid Build Coastguard Worker // Like TORCH_CHECK, but raises IndexErrors instead of Errors.
574*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_INDEX(cond, ...) \
575*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK_WITH_MSG(IndexError, cond, "INDEX", __VA_ARGS__)
576*da0073e9SAndroid Build Coastguard Worker 
577*da0073e9SAndroid Build Coastguard Worker // Like TORCH_CHECK, but raises ValueErrors instead of Errors.
578*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_VALUE(cond, ...) \
579*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK_WITH_MSG(ValueError, cond, "VALUE", __VA_ARGS__)
580*da0073e9SAndroid Build Coastguard Worker 
581*da0073e9SAndroid Build Coastguard Worker // Like TORCH_CHECK, but raises TypeErrors instead of Errors.
582*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_TYPE(cond, ...) \
583*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK_WITH_MSG(TypeError, cond, "TYPE", __VA_ARGS__)
584*da0073e9SAndroid Build Coastguard Worker 
585*da0073e9SAndroid Build Coastguard Worker // Like TORCH_CHECK, but raises NotImplementedErrors instead of Errors.
586*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_NOT_IMPLEMENTED(cond, ...) \
587*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK_WITH_MSG(NotImplementedError, cond, "TYPE", __VA_ARGS__)
588*da0073e9SAndroid Build Coastguard Worker 
589*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_ALWAYS_SHOW_CPP_STACKTRACE(cond, ...) \
590*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK_WITH_MSG(                                   \
591*da0073e9SAndroid Build Coastguard Worker       ErrorAlwaysShowCppStacktrace, cond, "TYPE", ##__VA_ARGS__)
592*da0073e9SAndroid Build Coastguard Worker 
593*da0073e9SAndroid Build Coastguard Worker #ifdef STRIP_ERROR_MESSAGES
594*da0073e9SAndroid Build Coastguard Worker #define WARNING_MESSAGE_STRING(...) \
595*da0073e9SAndroid Build Coastguard Worker   ::c10::detail::CompileTimeEmptyString {}
596*da0073e9SAndroid Build Coastguard Worker #else
597*da0073e9SAndroid Build Coastguard Worker #define WARNING_MESSAGE_STRING(...) ::c10::str(__VA_ARGS__)
598*da0073e9SAndroid Build Coastguard Worker #endif
599*da0073e9SAndroid Build Coastguard Worker 
600*da0073e9SAndroid Build Coastguard Worker // Report a warning to the user.  Accepts an arbitrary number of extra
601*da0073e9SAndroid Build Coastguard Worker // arguments which are concatenated into the warning message using operator<<
602*da0073e9SAndroid Build Coastguard Worker //
603*da0073e9SAndroid Build Coastguard Worker #ifdef DISABLE_WARN
604*da0073e9SAndroid Build Coastguard Worker #define _TORCH_WARN_WITH(...) ((void)0);
605*da0073e9SAndroid Build Coastguard Worker #else
606*da0073e9SAndroid Build Coastguard Worker #define _TORCH_WARN_WITH(warning_t, ...)                     \
607*da0073e9SAndroid Build Coastguard Worker   ::c10::warn(::c10::Warning(                                \
608*da0073e9SAndroid Build Coastguard Worker       warning_t(),                                           \
609*da0073e9SAndroid Build Coastguard Worker       {__func__, __FILE__, static_cast<uint32_t>(__LINE__)}, \
610*da0073e9SAndroid Build Coastguard Worker       WARNING_MESSAGE_STRING(__VA_ARGS__),                   \
611*da0073e9SAndroid Build Coastguard Worker       false));
612*da0073e9SAndroid Build Coastguard Worker #endif
613*da0073e9SAndroid Build Coastguard Worker 
614*da0073e9SAndroid Build Coastguard Worker #define TORCH_WARN(...) _TORCH_WARN_WITH(::c10::UserWarning, __VA_ARGS__);
615*da0073e9SAndroid Build Coastguard Worker 
616*da0073e9SAndroid Build Coastguard Worker #define TORCH_WARN_DEPRECATION(...) \
617*da0073e9SAndroid Build Coastguard Worker   _TORCH_WARN_WITH(::c10::DeprecationWarning, __VA_ARGS__);
618*da0073e9SAndroid Build Coastguard Worker 
619*da0073e9SAndroid Build Coastguard Worker // Report a warning to the user only once.  Accepts an arbitrary number of extra
620*da0073e9SAndroid Build Coastguard Worker // arguments which are concatenated into the warning message using operator<<
621*da0073e9SAndroid Build Coastguard Worker //
622*da0073e9SAndroid Build Coastguard Worker #define _TORCH_WARN_ONCE(...)                                             \
623*da0073e9SAndroid Build Coastguard Worker   C10_UNUSED static const auto C10_ANONYMOUS_VARIABLE(torch_warn_once_) = \
624*da0073e9SAndroid Build Coastguard Worker       [&] {                                                               \
625*da0073e9SAndroid Build Coastguard Worker         TORCH_WARN(__VA_ARGS__);                                          \
626*da0073e9SAndroid Build Coastguard Worker         return true;                                                      \
627*da0073e9SAndroid Build Coastguard Worker       }()
628*da0073e9SAndroid Build Coastguard Worker 
629*da0073e9SAndroid Build Coastguard Worker #ifdef DISABLE_WARN
630*da0073e9SAndroid Build Coastguard Worker #define TORCH_WARN_ONCE(...) ((void)0);
631*da0073e9SAndroid Build Coastguard Worker #else
632*da0073e9SAndroid Build Coastguard Worker #define TORCH_WARN_ONCE(...)                   \
633*da0073e9SAndroid Build Coastguard Worker   if (::c10::WarningUtils::get_warnAlways()) { \
634*da0073e9SAndroid Build Coastguard Worker     TORCH_WARN(__VA_ARGS__);                   \
635*da0073e9SAndroid Build Coastguard Worker   } else {                                     \
636*da0073e9SAndroid Build Coastguard Worker     _TORCH_WARN_ONCE(__VA_ARGS__);             \
637*da0073e9SAndroid Build Coastguard Worker   }
638*da0073e9SAndroid Build Coastguard Worker #endif
639*da0073e9SAndroid Build Coastguard Worker 
640*da0073e9SAndroid Build Coastguard Worker // Report an error with a specific argument
641*da0073e9SAndroid Build Coastguard Worker // NOTE: using the argument name in TORCH_CHECK's message is preferred
642*da0073e9SAndroid Build Coastguard Worker #define TORCH_CHECK_ARG(cond, argN, ...) \
643*da0073e9SAndroid Build Coastguard Worker   TORCH_CHECK(cond, "invalid argument ", argN, ": ", __VA_ARGS__)
644*da0073e9SAndroid Build Coastguard Worker 
645*da0073e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
646*da0073e9SAndroid Build Coastguard Worker // Deprecated macros
647*da0073e9SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
648*da0073e9SAndroid Build Coastguard Worker 
649*da0073e9SAndroid Build Coastguard Worker namespace c10::detail {
650*da0073e9SAndroid Build Coastguard Worker 
651*da0073e9SAndroid Build Coastguard Worker /*
652*da0073e9SAndroid Build Coastguard Worker // Deprecation disabled until we fix sites in our codebase
653*da0073e9SAndroid Build Coastguard Worker C10_DEPRECATED_MESSAGE("AT_ERROR(msg) is deprecated, use TORCH_CHECK(false, msg)
654*da0073e9SAndroid Build Coastguard Worker instead.")
655*da0073e9SAndroid Build Coastguard Worker */
deprecated_AT_ERROR()656*da0073e9SAndroid Build Coastguard Worker inline void deprecated_AT_ERROR() {}
657*da0073e9SAndroid Build Coastguard Worker 
658*da0073e9SAndroid Build Coastguard Worker /*
659*da0073e9SAndroid Build Coastguard Worker // Deprecation disabled until we fix sites in our codebase
660*da0073e9SAndroid Build Coastguard Worker C10_DEPRECATED_MESSAGE("AT_ASSERT is deprecated, if you mean to indicate an
661*da0073e9SAndroid Build Coastguard Worker internal invariant failure, use " \
662*da0073e9SAndroid Build Coastguard Worker                        "TORCH_INTERNAL_ASSERT instead; if you mean to do user
663*da0073e9SAndroid Build Coastguard Worker error checking, use " \ "TORCH_CHECK.  See
664*da0073e9SAndroid Build Coastguard Worker https://github.com/pytorch/pytorch/issues/20287 for more details.")
665*da0073e9SAndroid Build Coastguard Worker */
deprecated_AT_ASSERT()666*da0073e9SAndroid Build Coastguard Worker inline void deprecated_AT_ASSERT() {}
667*da0073e9SAndroid Build Coastguard Worker 
668*da0073e9SAndroid Build Coastguard Worker /*
669*da0073e9SAndroid Build Coastguard Worker // Deprecation disabled until we fix sites in our codebase
670*da0073e9SAndroid Build Coastguard Worker C10_DEPRECATED_MESSAGE("AT_ASSERTM is deprecated, if you mean to indicate an
671*da0073e9SAndroid Build Coastguard Worker internal invariant failure, use " \
672*da0073e9SAndroid Build Coastguard Worker                        "TORCH_INTERNAL_ASSERT instead; if you mean to do user
673*da0073e9SAndroid Build Coastguard Worker error checking, use " \ "TORCH_CHECK.  See
674*da0073e9SAndroid Build Coastguard Worker https://github.com/pytorch/pytorch/issues/20287 for more details.")
675*da0073e9SAndroid Build Coastguard Worker */
deprecated_AT_ASSERTM()676*da0073e9SAndroid Build Coastguard Worker inline void deprecated_AT_ASSERTM() {}
677*da0073e9SAndroid Build Coastguard Worker 
678*da0073e9SAndroid Build Coastguard Worker } // namespace c10::detail
679*da0073e9SAndroid Build Coastguard Worker 
680*da0073e9SAndroid Build Coastguard Worker // Deprecated alias; this alias was deprecated because people kept mistakenly
681*da0073e9SAndroid Build Coastguard Worker // using it for user error checking.  Use TORCH_INTERNAL_ASSERT or TORCH_CHECK
682*da0073e9SAndroid Build Coastguard Worker // instead. See https://github.com/pytorch/pytorch/issues/20287 for more
683*da0073e9SAndroid Build Coastguard Worker // details.
684*da0073e9SAndroid Build Coastguard Worker #define AT_ASSERT(...)                                              \
685*da0073e9SAndroid Build Coastguard Worker   do {                                                              \
686*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::deprecated_AT_ASSERT();                          \
687*da0073e9SAndroid Build Coastguard Worker     C10_EXPAND_MSVC_WORKAROUND(TORCH_INTERNAL_ASSERT(__VA_ARGS__)); \
688*da0073e9SAndroid Build Coastguard Worker   } while (false)
689*da0073e9SAndroid Build Coastguard Worker 
690*da0073e9SAndroid Build Coastguard Worker // Deprecated alias, like AT_ASSERT.  The new TORCH_INTERNAL_ASSERT macro
691*da0073e9SAndroid Build Coastguard Worker // supports both 0-ary and variadic calls, so having a separate
692*da0073e9SAndroid Build Coastguard Worker // message-accepting macro is not necessary.
693*da0073e9SAndroid Build Coastguard Worker //
694*da0073e9SAndroid Build Coastguard Worker // NB: we MUST include cond explicitly here, as MSVC will miscompile the macro
695*da0073e9SAndroid Build Coastguard Worker // expansion, shunting all of __VA_ARGS__ to cond.  An alternate workaround
696*da0073e9SAndroid Build Coastguard Worker // can be seen at
697*da0073e9SAndroid Build Coastguard Worker // https://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly
698*da0073e9SAndroid Build Coastguard Worker #define AT_ASSERTM(cond, ...)                                             \
699*da0073e9SAndroid Build Coastguard Worker   do {                                                                    \
700*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::deprecated_AT_ASSERTM();                               \
701*da0073e9SAndroid Build Coastguard Worker     C10_EXPAND_MSVC_WORKAROUND(TORCH_INTERNAL_ASSERT(cond, __VA_ARGS__)); \
702*da0073e9SAndroid Build Coastguard Worker   } while (false)
703*da0073e9SAndroid Build Coastguard Worker 
704*da0073e9SAndroid Build Coastguard Worker // Deprecated alias; this alias was deprecated because it represents extra API
705*da0073e9SAndroid Build Coastguard Worker // surface that makes it hard for people to understand what macro to use.
706*da0073e9SAndroid Build Coastguard Worker // Use TORCH_CHECK(false, ...) or TORCH_INTERNAL_ASSERT(false, ...) to
707*da0073e9SAndroid Build Coastguard Worker // unconditionally fail at a line of code.
708*da0073e9SAndroid Build Coastguard Worker #define AT_ERROR(...)                                                        \
709*da0073e9SAndroid Build Coastguard Worker   do {                                                                       \
710*da0073e9SAndroid Build Coastguard Worker     ::c10::detail::deprecated_AT_ERROR();                                    \
711*da0073e9SAndroid Build Coastguard Worker     C10_EXPAND_MSVC_WORKAROUND(TORCH_CHECK(false, ::c10::str(__VA_ARGS__))); \
712*da0073e9SAndroid Build Coastguard Worker   } while (false)
713*da0073e9SAndroid Build Coastguard Worker 
714*da0073e9SAndroid Build Coastguard Worker #endif // C10_UTIL_EXCEPTION_H_
715