1 | // |
2 | // Copyright 2017 The Abseil Authors. |
3 | // |
4 | // Licensed under the Apache License, Version 2.0 (the "License"); |
5 | // you may not use this file except in compliance with the License. |
6 | // You may obtain a copy of the License at |
7 | // |
8 | // https://www.apache.org/licenses/LICENSE-2.0 |
9 | // |
10 | // Unless required by applicable law or agreed to in writing, software |
11 | // distributed under the License is distributed on an "AS IS" BASIS, |
12 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | // See the License for the specific language governing permissions and |
14 | // limitations under the License. |
15 | // |
16 | |
17 | #ifndef ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ |
18 | #define ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ |
19 | |
20 | #include <string> |
21 | |
22 | #include "absl/base/config.h" |
23 | |
24 | namespace absl { |
25 | ABSL_NAMESPACE_BEGIN |
26 | namespace base_internal { |
27 | |
28 | // Helper functions that allow throwing exceptions consistently from anywhere. |
29 | // The main use case is for header-based libraries (eg templates), as they will |
30 | // be built by many different targets with their own compiler options. |
31 | // In particular, this will allow a safe way to throw exceptions even if the |
32 | // caller is compiled with -fno-exceptions. This is intended for implementing |
33 | // things like map<>::at(), which the standard documents as throwing an |
34 | // exception on error. |
35 | // |
36 | // Using other techniques like #if tricks could lead to ODR violations. |
37 | // |
38 | // You shouldn't use it unless you're writing code that you know will be built |
39 | // both with and without exceptions and you need to conform to an interface |
40 | // that uses exceptions. |
41 | |
42 | [[noreturn]] void ThrowStdLogicError(const std::string& what_arg); |
43 | [[noreturn]] void ThrowStdLogicError(const char* what_arg); |
44 | [[noreturn]] void ThrowStdInvalidArgument(const std::string& what_arg); |
45 | [[noreturn]] void ThrowStdInvalidArgument(const char* what_arg); |
46 | [[noreturn]] void ThrowStdDomainError(const std::string& what_arg); |
47 | [[noreturn]] void ThrowStdDomainError(const char* what_arg); |
48 | [[noreturn]] void ThrowStdLengthError(const std::string& what_arg); |
49 | [[noreturn]] void ThrowStdLengthError(const char* what_arg); |
50 | [[noreturn]] void ThrowStdOutOfRange(const std::string& what_arg); |
51 | [[noreturn]] void ThrowStdOutOfRange(const char* what_arg); |
52 | [[noreturn]] void ThrowStdRuntimeError(const std::string& what_arg); |
53 | [[noreturn]] void ThrowStdRuntimeError(const char* what_arg); |
54 | [[noreturn]] void ThrowStdRangeError(const std::string& what_arg); |
55 | [[noreturn]] void ThrowStdRangeError(const char* what_arg); |
56 | [[noreturn]] void ThrowStdOverflowError(const std::string& what_arg); |
57 | [[noreturn]] void ThrowStdOverflowError(const char* what_arg); |
58 | [[noreturn]] void ThrowStdUnderflowError(const std::string& what_arg); |
59 | [[noreturn]] void ThrowStdUnderflowError(const char* what_arg); |
60 | |
61 | [[noreturn]] void ThrowStdBadFunctionCall(); |
62 | [[noreturn]] void ThrowStdBadAlloc(); |
63 | |
64 | // ThrowStdBadArrayNewLength() cannot be consistently supported because |
65 | // std::bad_array_new_length is missing in libstdc++ until 4.9.0. |
66 | // https://gcc.gnu.org/onlinedocs/gcc-4.8.3/libstdc++/api/a01379_source.html |
67 | // https://gcc.gnu.org/onlinedocs/gcc-4.9.0/libstdc++/api/a01327_source.html |
68 | // libcxx (as of 3.2) and msvc (as of 2015) both have it. |
69 | // [[noreturn]] void ThrowStdBadArrayNewLength(); |
70 | |
71 | } // namespace base_internal |
72 | ABSL_NAMESPACE_END |
73 | } // namespace absl |
74 | |
75 | #endif // ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ |
76 | |