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 | namespace absl { |
23 | namespace base_internal { |
24 | |
25 | // Helper functions that allow throwing exceptions consistently from anywhere. |
26 | // The main use case is for header-based libraries (eg templates), as they will |
27 | // be built by many different targets with their own compiler options. |
28 | // In particular, this will allow a safe way to throw exceptions even if the |
29 | // caller is compiled with -fno-exceptions. This is intended for implementing |
30 | // things like map<>::at(), which the standard documents as throwing an |
31 | // exception on error. |
32 | // |
33 | // Using other techniques like #if tricks could lead to ODR violations. |
34 | // |
35 | // You shouldn't use it unless you're writing code that you know will be built |
36 | // both with and without exceptions and you need to conform to an interface |
37 | // that uses exceptions. |
38 | |
39 | [[noreturn]] void ThrowStdLogicError(const std::string& what_arg); |
40 | [[noreturn]] void ThrowStdLogicError(const char* what_arg); |
41 | [[noreturn]] void ThrowStdInvalidArgument(const std::string& what_arg); |
42 | [[noreturn]] void ThrowStdInvalidArgument(const char* what_arg); |
43 | [[noreturn]] void ThrowStdDomainError(const std::string& what_arg); |
44 | [[noreturn]] void ThrowStdDomainError(const char* what_arg); |
45 | [[noreturn]] void ThrowStdLengthError(const std::string& what_arg); |
46 | [[noreturn]] void ThrowStdLengthError(const char* what_arg); |
47 | [[noreturn]] void ThrowStdOutOfRange(const std::string& what_arg); |
48 | [[noreturn]] void ThrowStdOutOfRange(const char* what_arg); |
49 | [[noreturn]] void ThrowStdRuntimeError(const std::string& what_arg); |
50 | [[noreturn]] void ThrowStdRuntimeError(const char* what_arg); |
51 | [[noreturn]] void ThrowStdRangeError(const std::string& what_arg); |
52 | [[noreturn]] void ThrowStdRangeError(const char* what_arg); |
53 | [[noreturn]] void ThrowStdOverflowError(const std::string& what_arg); |
54 | [[noreturn]] void ThrowStdOverflowError(const char* what_arg); |
55 | [[noreturn]] void ThrowStdUnderflowError(const std::string& what_arg); |
56 | [[noreturn]] void ThrowStdUnderflowError(const char* what_arg); |
57 | |
58 | [[noreturn]] void ThrowStdBadFunctionCall(); |
59 | [[noreturn]] void ThrowStdBadAlloc(); |
60 | |
61 | // ThrowStdBadArrayNewLength() cannot be consistently supported because |
62 | // std::bad_array_new_length is missing in libstdc++ until 4.9.0. |
63 | // https://gcc.gnu.org/onlinedocs/gcc-4.8.3/libstdc++/api/a01379_source.html |
64 | // https://gcc.gnu.org/onlinedocs/gcc-4.9.0/libstdc++/api/a01327_source.html |
65 | // libcxx (as of 3.2) and msvc (as of 2015) both have it. |
66 | // [[noreturn]] void ThrowStdBadArrayNewLength(); |
67 | |
68 | } // namespace base_internal |
69 | } // namespace absl |
70 | |
71 | #endif // ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ |
72 | |