Bug Summary

File:llvm/include/llvm/Support/Error.h
Warning:line 289, column 3
Potential leak of memory pointed to by field 'Payload'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name InlineInfo.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/lib/DebugInfo/GSYM -resource-dir /usr/lib/llvm-14/lib/clang/14.0.0 -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/lib/DebugInfo/GSYM -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/llvm/lib/DebugInfo/GSYM -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/include -I /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/llvm/include -D NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/build-llvm/lib/DebugInfo/GSYM -fdebug-prefix-map=/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e=. -ferror-limit 19 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2021-09-04-040900-46481-1 -x c++ /build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/llvm/lib/DebugInfo/GSYM/InlineInfo.cpp

/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/llvm/lib/DebugInfo/GSYM/InlineInfo.cpp

1//===- InlineInfo.cpp -------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/DebugInfo/GSYM/FileEntry.h"
10#include "llvm/DebugInfo/GSYM/FileWriter.h"
11#include "llvm/DebugInfo/GSYM/GsymReader.h"
12#include "llvm/DebugInfo/GSYM/InlineInfo.h"
13#include "llvm/Support/DataExtractor.h"
14#include <algorithm>
15#include <inttypes.h>
16
17using namespace llvm;
18using namespace gsym;
19
20
21raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const InlineInfo &II) {
22 if (!II.isValid())
23 return OS;
24 bool First = true;
25 for (auto Range : II.Ranges) {
26 if (First)
27 First = false;
28 else
29 OS << ' ';
30 OS << Range;
31 }
32 OS << " Name = " << HEX32(II.Name)llvm::format_hex(II.Name, 10) << ", CallFile = " << II.CallFile
33 << ", CallLine = " << II.CallFile << '\n';
34 for (const auto &Child : II.Children)
35 OS << Child;
36 return OS;
37}
38
39static bool getInlineStackHelper(const InlineInfo &II, uint64_t Addr,
40 std::vector<const InlineInfo *> &InlineStack) {
41 if (II.Ranges.contains(Addr)) {
42 // If this is the top level that represents the concrete function,
43 // there will be no name and we shoud clear the inline stack. Otherwise
44 // we have found an inline call stack that we need to insert.
45 if (II.Name != 0)
46 InlineStack.insert(InlineStack.begin(), &II);
47 for (const auto &Child : II.Children) {
48 if (::getInlineStackHelper(Child, Addr, InlineStack))
49 break;
50 }
51 return !InlineStack.empty();
52 }
53 return false;
54}
55
56llvm::Optional<InlineInfo::InlineArray> InlineInfo::getInlineStack(uint64_t Addr) const {
57 InlineArray Result;
58 if (getInlineStackHelper(*this, Addr, Result))
59 return Result;
60 return llvm::None;
61}
62
63/// Skip an InlineInfo object in the specified data at the specified offset.
64///
65/// Used during the InlineInfo::lookup() call to quickly skip child InlineInfo
66/// objects where the addres ranges isn't contained in the InlineInfo object
67/// or its children. This avoids allocations by not appending child InlineInfo
68/// objects to the InlineInfo::Children array.
69///
70/// \param Data The binary stream to read the data from.
71///
72/// \param Offset The byte offset within \a Data.
73///
74/// \param SkippedRanges If true, address ranges have already been skipped.
75
76static bool skip(DataExtractor &Data, uint64_t &Offset, bool SkippedRanges) {
77 if (!SkippedRanges) {
78 if (AddressRanges::skip(Data, Offset) == 0)
79 return false;
80 }
81 bool HasChildren = Data.getU8(&Offset) != 0;
82 Data.getU32(&Offset); // Skip Inline.Name.
83 Data.getULEB128(&Offset); // Skip Inline.CallFile.
84 Data.getULEB128(&Offset); // Skip Inline.CallLine.
85 if (HasChildren) {
86 while (skip(Data, Offset, false /* SkippedRanges */))
87 /* Do nothing */;
88 }
89 // We skipped a valid InlineInfo.
90 return true;
91}
92
93/// A Lookup helper functions.
94///
95/// Used during the InlineInfo::lookup() call to quickly only parse an
96/// InlineInfo object if the address falls within this object. This avoids
97/// allocations by not appending child InlineInfo objects to the
98/// InlineInfo::Children array and also skips any InlineInfo objects that do
99/// not contain the address we are looking up.
100///
101/// \param Data The binary stream to read the data from.
102///
103/// \param Offset The byte offset within \a Data.
104///
105/// \param BaseAddr The address that the relative address range offsets are
106/// relative to.
107
108static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset,
109 uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs,
110 llvm::Error &Err) {
111 InlineInfo Inline;
112 Inline.Ranges.decode(Data, BaseAddr, Offset);
113 if (Inline.Ranges.empty())
2
Assuming the condition is false
3
Taking false branch
10
Assuming the condition is false
11
Taking false branch
29
Assuming the condition is false
30
Taking false branch
114 return true;
115 // Check if the address is contained within the inline information, and if
116 // not, quickly skip this InlineInfo object and all its children.
117 if (!Inline.Ranges.contains(Addr)) {
4
Assuming the condition is false
5
Taking false branch
12
Assuming the condition is false
13
Taking false branch
31
Assuming the condition is false
32
Taking false branch
118 skip(Data, Offset, true /* SkippedRanges */);
119 return false;
120 }
121
122 // The address range is contained within this InlineInfo, add the source
123 // location for this InlineInfo and any children that contain the address.
124 bool HasChildren = Data.getU8(&Offset) != 0;
6
Assuming the condition is true
14
Assuming the condition is false
33
Assuming the condition is false
125 Inline.Name = Data.getU32(&Offset);
126 Inline.CallFile = (uint32_t)Data.getULEB128(&Offset);
127 Inline.CallLine = (uint32_t)Data.getULEB128(&Offset);
128 if (HasChildren
6.1
'HasChildren' is true
14.1
'HasChildren' is false
33.1
'HasChildren' is false
6.1
'HasChildren' is true
14.1
'HasChildren' is false
33.1
'HasChildren' is false
6.1
'HasChildren' is true
14.1
'HasChildren' is false
33.1
'HasChildren' is false
) {
7
Taking true branch
15
Taking false branch
34
Taking false branch
129 // Child address ranges are encoded relative to the first address in the
130 // parent InlineInfo object.
131 const auto ChildBaseAddr = Inline.Ranges[0].Start;
132 bool Done = false;
133 while (!Done)
8
Loop condition is true. Entering loop body
27
Loop condition is true. Entering loop body
134 Done = lookup(GR, Data, Offset, ChildBaseAddr, Addr, SrcLocs, Err);
9
Calling 'lookup'
26
Returned allocated memory
28
Calling 'lookup'
135 }
136
137 Optional<FileEntry> CallFile = GR.getFile(Inline.CallFile);
138 if (!CallFile) {
16
Taking true branch
35
Taking true branch
139 Err = createStringError(std::errc::invalid_argument,
17
Calling 'createStringError<unsigned int>'
25
Returned allocated memory
36
Calling move assignment operator for 'Error'
140 "failed to extract file[%" PRIu32"u" "]",
141 Inline.CallFile);
142 return false;
143 }
144
145 if (CallFile->Dir || CallFile->Base) {
146 SourceLocation SrcLoc;
147 SrcLoc.Name = SrcLocs.back().Name;
148 SrcLoc.Offset = SrcLocs.back().Offset;
149 SrcLoc.Dir = GR.getString(CallFile->Dir);
150 SrcLoc.Base = GR.getString(CallFile->Base);
151 SrcLoc.Line = Inline.CallLine;
152 SrcLocs.back().Name = GR.getString(Inline.Name);
153 SrcLocs.back().Offset = Addr - Inline.Ranges[0].Start;
154 SrcLocs.push_back(SrcLoc);
155 }
156 return true;
157}
158
159llvm::Error InlineInfo::lookup(const GsymReader &GR, DataExtractor &Data,
160 uint64_t BaseAddr, uint64_t Addr,
161 SourceLocations &SrcLocs) {
162 // Call our recursive helper function starting at offset zero.
163 uint64_t Offset = 0;
164 llvm::Error Err = Error::success();
165 ::lookup(GR, Data, Offset, BaseAddr, Addr, SrcLocs, Err);
1
Calling 'lookup'
166 return Err;
167}
168
169/// Decode an InlineInfo in Data at the specified offset.
170///
171/// A local helper function to decode InlineInfo objects. This function is
172/// called recursively when parsing child InlineInfo objects.
173///
174/// \param Data The data extractor to decode from.
175/// \param Offset The offset within \a Data to decode from.
176/// \param BaseAddr The base address to use when decoding address ranges.
177/// \returns An InlineInfo or an error describing the issue that was
178/// encountered during decoding.
179static llvm::Expected<InlineInfo> decode(DataExtractor &Data, uint64_t &Offset,
180 uint64_t BaseAddr) {
181 InlineInfo Inline;
182 if (!Data.isValidOffset(Offset))
183 return createStringError(std::errc::io_error,
184 "0x%8.8" PRIx64"l" "x" ": missing InlineInfo address ranges data", Offset);
185 Inline.Ranges.decode(Data, BaseAddr, Offset);
186 if (Inline.Ranges.empty())
187 return Inline;
188 if (!Data.isValidOffsetForDataOfSize(Offset, 1))
189 return createStringError(std::errc::io_error,
190 "0x%8.8" PRIx64"l" "x" ": missing InlineInfo uint8_t indicating children",
191 Offset);
192 bool HasChildren = Data.getU8(&Offset) != 0;
193 if (!Data.isValidOffsetForDataOfSize(Offset, 4))
194 return createStringError(std::errc::io_error,
195 "0x%8.8" PRIx64"l" "x" ": missing InlineInfo uint32_t for name", Offset);
196 Inline.Name = Data.getU32(&Offset);
197 if (!Data.isValidOffset(Offset))
198 return createStringError(std::errc::io_error,
199 "0x%8.8" PRIx64"l" "x" ": missing ULEB128 for InlineInfo call file", Offset);
200 Inline.CallFile = (uint32_t)Data.getULEB128(&Offset);
201 if (!Data.isValidOffset(Offset))
202 return createStringError(std::errc::io_error,
203 "0x%8.8" PRIx64"l" "x" ": missing ULEB128 for InlineInfo call line", Offset);
204 Inline.CallLine = (uint32_t)Data.getULEB128(&Offset);
205 if (HasChildren) {
206 // Child address ranges are encoded relative to the first address in the
207 // parent InlineInfo object.
208 const auto ChildBaseAddr = Inline.Ranges[0].Start;
209 while (true) {
210 llvm::Expected<InlineInfo> Child = decode(Data, Offset, ChildBaseAddr);
211 if (!Child)
212 return Child.takeError();
213 // InlineInfo with empty Ranges termintes a child sibling chain.
214 if (Child.get().Ranges.empty())
215 break;
216 Inline.Children.emplace_back(std::move(*Child));
217 }
218 }
219 return Inline;
220}
221
222llvm::Expected<InlineInfo> InlineInfo::decode(DataExtractor &Data,
223 uint64_t BaseAddr) {
224 uint64_t Offset = 0;
225 return ::decode(Data, Offset, BaseAddr);
226}
227
228llvm::Error InlineInfo::encode(FileWriter &O, uint64_t BaseAddr) const {
229 // Users must verify the InlineInfo is valid prior to calling this funtion.
230 // We don't want to emit any InlineInfo objects if they are not valid since
231 // it will waste space in the GSYM file.
232 if (!isValid())
233 return createStringError(std::errc::invalid_argument,
234 "attempted to encode invalid InlineInfo object");
235 Ranges.encode(O, BaseAddr);
236 bool HasChildren = !Children.empty();
237 O.writeU8(HasChildren);
238 O.writeU32(Name);
239 O.writeULEB(CallFile);
240 O.writeULEB(CallLine);
241 if (HasChildren) {
242 // Child address ranges are encoded as relative to the first
243 // address in the Ranges for this object. This keeps the offsets
244 // small and allows for efficient encoding using ULEB offsets.
245 const uint64_t ChildBaseAddr = Ranges[0].Start;
246 for (const auto &Child : Children) {
247 // Make sure all child address ranges are contained in the parent address
248 // ranges.
249 for (const auto &ChildRange: Child.Ranges) {
250 if (!Ranges.contains(ChildRange))
251 return createStringError(std::errc::invalid_argument,
252 "child range not contained in parent");
253 }
254 llvm::Error Err = Child.encode(O, ChildBaseAddr);
255 if (Err)
256 return Err;
257 }
258
259 // Terminate child sibling chain by emitting a zero. This zero will cause
260 // the decodeAll() function above to return false and stop the decoding
261 // of child InlineInfo objects that are siblings.
262 O.writeULEB(0);
263 }
264 return Error::success();
265}

/build/llvm-toolchain-snapshot-14~++20210903100615+fd66b44ec19e/llvm/include/llvm/Support/Error.h

1//===- llvm/Support/Error.h - Recoverable error handling --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines an API used to report recoverable errors.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_SUPPORT_ERROR_H
14#define LLVM_SUPPORT_ERROR_H
15
16#include "llvm-c/Error.h"
17#include "llvm/ADT/STLExtras.h"
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/ADT/StringExtras.h"
20#include "llvm/ADT/Twine.h"
21#include "llvm/Config/abi-breaking.h"
22#include "llvm/Support/AlignOf.h"
23#include "llvm/Support/Compiler.h"
24#include "llvm/Support/Debug.h"
25#include "llvm/Support/ErrorHandling.h"
26#include "llvm/Support/ErrorOr.h"
27#include "llvm/Support/Format.h"
28#include "llvm/Support/raw_ostream.h"
29#include <algorithm>
30#include <cassert>
31#include <cstdint>
32#include <cstdlib>
33#include <functional>
34#include <memory>
35#include <new>
36#include <string>
37#include <system_error>
38#include <type_traits>
39#include <utility>
40#include <vector>
41
42namespace llvm {
43
44class ErrorSuccess;
45
46/// Base class for error info classes. Do not extend this directly: Extend
47/// the ErrorInfo template subclass instead.
48class ErrorInfoBase {
49public:
50 virtual ~ErrorInfoBase() = default;
51
52 /// Print an error message to an output stream.
53 virtual void log(raw_ostream &OS) const = 0;
54
55 /// Return the error message as a string.
56 virtual std::string message() const {
57 std::string Msg;
58 raw_string_ostream OS(Msg);
59 log(OS);
60 return OS.str();
61 }
62
63 /// Convert this error to a std::error_code.
64 ///
65 /// This is a temporary crutch to enable interaction with code still
66 /// using std::error_code. It will be removed in the future.
67 virtual std::error_code convertToErrorCode() const = 0;
68
69 // Returns the class ID for this type.
70 static const void *classID() { return &ID; }
71
72 // Returns the class ID for the dynamic type of this ErrorInfoBase instance.
73 virtual const void *dynamicClassID() const = 0;
74
75 // Check whether this instance is a subclass of the class identified by
76 // ClassID.
77 virtual bool isA(const void *const ClassID) const {
78 return ClassID == classID();
79 }
80
81 // Check whether this instance is a subclass of ErrorInfoT.
82 template <typename ErrorInfoT> bool isA() const {
83 return isA(ErrorInfoT::classID());
84 }
85
86private:
87 virtual void anchor();
88
89 static char ID;
90};
91
92/// Lightweight error class with error context and mandatory checking.
93///
94/// Instances of this class wrap a ErrorInfoBase pointer. Failure states
95/// are represented by setting the pointer to a ErrorInfoBase subclass
96/// instance containing information describing the failure. Success is
97/// represented by a null pointer value.
98///
99/// Instances of Error also contains a 'Checked' flag, which must be set
100/// before the destructor is called, otherwise the destructor will trigger a
101/// runtime error. This enforces at runtime the requirement that all Error
102/// instances be checked or returned to the caller.
103///
104/// There are two ways to set the checked flag, depending on what state the
105/// Error instance is in. For Error instances indicating success, it
106/// is sufficient to invoke the boolean conversion operator. E.g.:
107///
108/// @code{.cpp}
109/// Error foo(<...>);
110///
111/// if (auto E = foo(<...>))
112/// return E; // <- Return E if it is in the error state.
113/// // We have verified that E was in the success state. It can now be safely
114/// // destroyed.
115/// @endcode
116///
117/// A success value *can not* be dropped. For example, just calling 'foo(<...>)'
118/// without testing the return value will raise a runtime error, even if foo
119/// returns success.
120///
121/// For Error instances representing failure, you must use either the
122/// handleErrors or handleAllErrors function with a typed handler. E.g.:
123///
124/// @code{.cpp}
125/// class MyErrorInfo : public ErrorInfo<MyErrorInfo> {
126/// // Custom error info.
127/// };
128///
129/// Error foo(<...>) { return make_error<MyErrorInfo>(...); }
130///
131/// auto E = foo(<...>); // <- foo returns failure with MyErrorInfo.
132/// auto NewE =
133/// handleErrors(E,
134/// [](const MyErrorInfo &M) {
135/// // Deal with the error.
136/// },
137/// [](std::unique_ptr<OtherError> M) -> Error {
138/// if (canHandle(*M)) {
139/// // handle error.
140/// return Error::success();
141/// }
142/// // Couldn't handle this error instance. Pass it up the stack.
143/// return Error(std::move(M));
144/// );
145/// // Note - we must check or return NewE in case any of the handlers
146/// // returned a new error.
147/// @endcode
148///
149/// The handleAllErrors function is identical to handleErrors, except
150/// that it has a void return type, and requires all errors to be handled and
151/// no new errors be returned. It prevents errors (assuming they can all be
152/// handled) from having to be bubbled all the way to the top-level.
153///
154/// *All* Error instances must be checked before destruction, even if
155/// they're moved-assigned or constructed from Success values that have already
156/// been checked. This enforces checking through all levels of the call stack.
157class LLVM_NODISCARD[[clang::warn_unused_result]] Error {
158 // ErrorList needs to be able to yank ErrorInfoBase pointers out of Errors
159 // to add to the error list. It can't rely on handleErrors for this, since
160 // handleErrors does not support ErrorList handlers.
161 friend class ErrorList;
162
163 // handleErrors needs to be able to set the Checked flag.
164 template <typename... HandlerTs>
165 friend Error handleErrors(Error E, HandlerTs &&... Handlers);
166
167 // Expected<T> needs to be able to steal the payload when constructed from an
168 // error.
169 template <typename T> friend class Expected;
170
171 // wrap needs to be able to steal the payload.
172 friend LLVMErrorRef wrap(Error);
173
174protected:
175 /// Create a success value. Prefer using 'Error::success()' for readability
176 Error() {
177 setPtr(nullptr);
178 setChecked(false);
179 }
180
181public:
182 /// Create a success value.
183 static ErrorSuccess success();
184
185 // Errors are not copy-constructable.
186 Error(const Error &Other) = delete;
187
188 /// Move-construct an error value. The newly constructed error is considered
189 /// unchecked, even if the source error had been checked. The original error
190 /// becomes a checked Success value, regardless of its original state.
191 Error(Error &&Other) {
192 setChecked(true);
193 *this = std::move(Other);
194 }
195
196 /// Create an error value. Prefer using the 'make_error' function, but
197 /// this constructor can be useful when "re-throwing" errors from handlers.
198 Error(std::unique_ptr<ErrorInfoBase> Payload) {
199 setPtr(Payload.release());
200 setChecked(false);
201 }
202
203 // Errors are not copy-assignable.
204 Error &operator=(const Error &Other) = delete;
205
206 /// Move-assign an error value. The current error must represent success, you
207 /// you cannot overwrite an unhandled error. The current error is then
208 /// considered unchecked. The source error becomes a checked success value,
209 /// regardless of its original state.
210 Error &operator=(Error &&Other) {
211 // Don't allow overwriting of unchecked values.
212 assertIsChecked();
213 setPtr(Other.getPtr());
37
Calling 'Error::setPtr'
214
215 // This Error is unchecked, even if the source error was checked.
216 setChecked(false);
217
218 // Null out Other's payload and set its checked bit.
219 Other.setPtr(nullptr);
220 Other.setChecked(true);
221
222 return *this;
223 }
224
225 /// Destroy a Error. Fails with a call to abort() if the error is
226 /// unchecked.
227 ~Error() {
228 assertIsChecked();
229 delete getPtr();
230 }
231
232 /// Bool conversion. Returns true if this Error is in a failure state,
233 /// and false if it is in an accept state. If the error is in a Success state
234 /// it will be considered checked.
235 explicit operator bool() {
236 setChecked(getPtr() == nullptr);
237 return getPtr() != nullptr;
238 }
239
240 /// Check whether one error is a subclass of another.
241 template <typename ErrT> bool isA() const {
242 return getPtr() && getPtr()->isA(ErrT::classID());
243 }
244
245 /// Returns the dynamic class id of this error, or null if this is a success
246 /// value.
247 const void* dynamicClassID() const {
248 if (!getPtr())
249 return nullptr;
250 return getPtr()->dynamicClassID();
251 }
252
253private:
254#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
255 // assertIsChecked() happens very frequently, but under normal circumstances
256 // is supposed to be a no-op. So we want it to be inlined, but having a bunch
257 // of debug prints can cause the function to be too large for inlining. So
258 // it's important that we define this function out of line so that it can't be
259 // inlined.
260 [[noreturn]] void fatalUncheckedError() const;
261#endif
262
263 void assertIsChecked() {
264#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
265 if (LLVM_UNLIKELY(!getChecked() || getPtr())__builtin_expect((bool)(!getChecked() || getPtr()), false))
266 fatalUncheckedError();
267#endif
268 }
269
270 ErrorInfoBase *getPtr() const {
271#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
272 return reinterpret_cast<ErrorInfoBase*>(
273 reinterpret_cast<uintptr_t>(Payload) &
274 ~static_cast<uintptr_t>(0x1));
275#else
276 return Payload;
277#endif
278 }
279
280 void setPtr(ErrorInfoBase *EI) {
281#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
282 Payload = reinterpret_cast<ErrorInfoBase*>(
283 (reinterpret_cast<uintptr_t>(EI) &
284 ~static_cast<uintptr_t>(0x1)) |
285 (reinterpret_cast<uintptr_t>(Payload) & 0x1));
286#else
287 Payload = EI;
288#endif
289 }
38
Potential leak of memory pointed to by field 'Payload'
290
291 bool getChecked() const {
292#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
293 return (reinterpret_cast<uintptr_t>(Payload) & 0x1) == 0;
294#else
295 return true;
296#endif
297 }
298
299 void setChecked(bool V) {
300#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
301 Payload = reinterpret_cast<ErrorInfoBase*>(
302 (reinterpret_cast<uintptr_t>(Payload) &
303 ~static_cast<uintptr_t>(0x1)) |
304 (V ? 0 : 1));
305#endif
306 }
307
308 std::unique_ptr<ErrorInfoBase> takePayload() {
309 std::unique_ptr<ErrorInfoBase> Tmp(getPtr());
310 setPtr(nullptr);
311 setChecked(true);
312 return Tmp;
313 }
314
315 friend raw_ostream &operator<<(raw_ostream &OS, const Error &E) {
316 if (auto P = E.getPtr())
317 P->log(OS);
318 else
319 OS << "success";
320 return OS;
321 }
322
323 ErrorInfoBase *Payload = nullptr;
324};
325
326/// Subclass of Error for the sole purpose of identifying the success path in
327/// the type system. This allows to catch invalid conversion to Expected<T> at
328/// compile time.
329class ErrorSuccess final : public Error {};
330
331inline ErrorSuccess Error::success() { return ErrorSuccess(); }
332
333/// Make a Error instance representing failure using the given error info
334/// type.
335template <typename ErrT, typename... ArgTs> Error make_error(ArgTs &&... Args) {
336 return Error(std::make_unique<ErrT>(std::forward<ArgTs>(Args)...));
20
Calling 'make_unique<llvm::StringError, std::basic_string<char> &, std::error_code &>'
22
Returned allocated memory
337}
338
339/// Base class for user error types. Users should declare their error types
340/// like:
341///
342/// class MyError : public ErrorInfo<MyError> {
343/// ....
344/// };
345///
346/// This class provides an implementation of the ErrorInfoBase::kind
347/// method, which is used by the Error RTTI system.
348template <typename ThisErrT, typename ParentErrT = ErrorInfoBase>
349class ErrorInfo : public ParentErrT {
350public:
351 using ParentErrT::ParentErrT; // inherit constructors
352
353 static const void *classID() { return &ThisErrT::ID; }
354
355 const void *dynamicClassID() const override { return &ThisErrT::ID; }
356
357 bool isA(const void *const ClassID) const override {
358 return ClassID == classID() || ParentErrT::isA(ClassID);
359 }
360};
361
362/// Special ErrorInfo subclass representing a list of ErrorInfos.
363/// Instances of this class are constructed by joinError.
364class ErrorList final : public ErrorInfo<ErrorList> {
365 // handleErrors needs to be able to iterate the payload list of an
366 // ErrorList.
367 template <typename... HandlerTs>
368 friend Error handleErrors(Error E, HandlerTs &&... Handlers);
369
370 // joinErrors is implemented in terms of join.
371 friend Error joinErrors(Error, Error);
372
373public:
374 void log(raw_ostream &OS) const override {
375 OS << "Multiple errors:\n";
376 for (auto &ErrPayload : Payloads) {
377 ErrPayload->log(OS);
378 OS << "\n";
379 }
380 }
381
382 std::error_code convertToErrorCode() const override;
383
384 // Used by ErrorInfo::classID.
385 static char ID;
386
387private:
388 ErrorList(std::unique_ptr<ErrorInfoBase> Payload1,
389 std::unique_ptr<ErrorInfoBase> Payload2) {
390 assert(!Payload1->isA<ErrorList>() && !Payload2->isA<ErrorList>() &&(static_cast<void> (0))
391 "ErrorList constructor payloads should be singleton errors")(static_cast<void> (0));
392 Payloads.push_back(std::move(Payload1));
393 Payloads.push_back(std::move(Payload2));
394 }
395
396 static Error join(Error E1, Error E2) {
397 if (!E1)
398 return E2;
399 if (!E2)
400 return E1;
401 if (E1.isA<ErrorList>()) {
402 auto &E1List = static_cast<ErrorList &>(*E1.getPtr());
403 if (E2.isA<ErrorList>()) {
404 auto E2Payload = E2.takePayload();
405 auto &E2List = static_cast<ErrorList &>(*E2Payload);
406 for (auto &Payload : E2List.Payloads)
407 E1List.Payloads.push_back(std::move(Payload));
408 } else
409 E1List.Payloads.push_back(E2.takePayload());
410
411 return E1;
412 }
413 if (E2.isA<ErrorList>()) {
414 auto &E2List = static_cast<ErrorList &>(*E2.getPtr());
415 E2List.Payloads.insert(E2List.Payloads.begin(), E1.takePayload());
416 return E2;
417 }
418 return Error(std::unique_ptr<ErrorList>(
419 new ErrorList(E1.takePayload(), E2.takePayload())));
420 }
421
422 std::vector<std::unique_ptr<ErrorInfoBase>> Payloads;
423};
424
425/// Concatenate errors. The resulting Error is unchecked, and contains the
426/// ErrorInfo(s), if any, contained in E1, followed by the
427/// ErrorInfo(s), if any, contained in E2.
428inline Error joinErrors(Error E1, Error E2) {
429 return ErrorList::join(std::move(E1), std::move(E2));
430}
431
432/// Tagged union holding either a T or a Error.
433///
434/// This class parallels ErrorOr, but replaces error_code with Error. Since
435/// Error cannot be copied, this class replaces getError() with
436/// takeError(). It also adds an bool errorIsA<ErrT>() method for testing the
437/// error class type.
438///
439/// Example usage of 'Expected<T>' as a function return type:
440///
441/// @code{.cpp}
442/// Expected<int> myDivide(int A, int B) {
443/// if (B == 0) {
444/// // return an Error
445/// return createStringError(inconvertibleErrorCode(),
446/// "B must not be zero!");
447/// }
448/// // return an integer
449/// return A / B;
450/// }
451/// @endcode
452///
453/// Checking the results of to a function returning 'Expected<T>':
454/// @code{.cpp}
455/// if (auto E = Result.takeError()) {
456/// // We must consume the error. Typically one of:
457/// // - return the error to our caller
458/// // - toString(), when logging
459/// // - consumeError(), to silently swallow the error
460/// // - handleErrors(), to distinguish error types
461/// errs() << "Problem with division " << toString(std::move(E)) << "\n";
462/// return;
463/// }
464/// // use the result
465/// outs() << "The answer is " << *Result << "\n";
466/// @endcode
467///
468/// For unit-testing a function returning an 'Expceted<T>', see the
469/// 'EXPECT_THAT_EXPECTED' macros in llvm/Testing/Support/Error.h
470
471template <class T> class LLVM_NODISCARD[[clang::warn_unused_result]] Expected {
472 template <class T1> friend class ExpectedAsOutParameter;
473 template <class OtherT> friend class Expected;
474
475 static constexpr bool isRef = std::is_reference<T>::value;
476
477 using wrap = std::reference_wrapper<std::remove_reference_t<T>>;
478
479 using error_type = std::unique_ptr<ErrorInfoBase>;
480
481public:
482 using storage_type = std::conditional_t<isRef, wrap, T>;
483 using value_type = T;
484
485private:
486 using reference = std::remove_reference_t<T> &;
487 using const_reference = const std::remove_reference_t<T> &;
488 using pointer = std::remove_reference_t<T> *;
489 using const_pointer = const std::remove_reference_t<T> *;
490
491public:
492 /// Create an Expected<T> error value from the given Error.
493 Expected(Error Err)
494 : HasError(true)
495#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
496 // Expected is unchecked upon construction in Debug builds.
497 , Unchecked(true)
498#endif
499 {
500 assert(Err && "Cannot create Expected<T> from Error success value.")(static_cast<void> (0));
501 new (getErrorStorage()) error_type(Err.takePayload());
502 }
503
504 /// Forbid to convert from Error::success() implicitly, this avoids having
505 /// Expected<T> foo() { return Error::success(); } which compiles otherwise
506 /// but triggers the assertion above.
507 Expected(ErrorSuccess) = delete;
508
509 /// Create an Expected<T> success value from the given OtherT value, which
510 /// must be convertible to T.
511 template <typename OtherT>
512 Expected(OtherT &&Val,
513 std::enable_if_t<std::is_convertible<OtherT, T>::value> * = nullptr)
514 : HasError(false)
515#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
516 // Expected is unchecked upon construction in Debug builds.
517 ,
518 Unchecked(true)
519#endif
520 {
521 new (getStorage()) storage_type(std::forward<OtherT>(Val));
522 }
523
524 /// Move construct an Expected<T> value.
525 Expected(Expected &&Other) { moveConstruct(std::move(Other)); }
526
527 /// Move construct an Expected<T> value from an Expected<OtherT>, where OtherT
528 /// must be convertible to T.
529 template <class OtherT>
530 Expected(
531 Expected<OtherT> &&Other,
532 std::enable_if_t<std::is_convertible<OtherT, T>::value> * = nullptr) {
533 moveConstruct(std::move(Other));
534 }
535
536 /// Move construct an Expected<T> value from an Expected<OtherT>, where OtherT
537 /// isn't convertible to T.
538 template <class OtherT>
539 explicit Expected(
540 Expected<OtherT> &&Other,
541 std::enable_if_t<!std::is_convertible<OtherT, T>::value> * = nullptr) {
542 moveConstruct(std::move(Other));
543 }
544
545 /// Move-assign from another Expected<T>.
546 Expected &operator=(Expected &&Other) {
547 moveAssign(std::move(Other));
548 return *this;
549 }
550
551 /// Destroy an Expected<T>.
552 ~Expected() {
553 assertIsChecked();
554 if (!HasError)
555 getStorage()->~storage_type();
556 else
557 getErrorStorage()->~error_type();
558 }
559
560 /// Return false if there is an error.
561 explicit operator bool() {
562#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
563 Unchecked = HasError;
564#endif
565 return !HasError;
566 }
567
568 /// Returns a reference to the stored T value.
569 reference get() {
570 assertIsChecked();
571 return *getStorage();
572 }
573
574 /// Returns a const reference to the stored T value.
575 const_reference get() const {
576 assertIsChecked();
577 return const_cast<Expected<T> *>(this)->get();
578 }
579
580 /// Check that this Expected<T> is an error of type ErrT.
581 template <typename ErrT> bool errorIsA() const {
582 return HasError && (*getErrorStorage())->template isA<ErrT>();
583 }
584
585 /// Take ownership of the stored error.
586 /// After calling this the Expected<T> is in an indeterminate state that can
587 /// only be safely destructed. No further calls (beside the destructor) should
588 /// be made on the Expected<T> value.
589 Error takeError() {
590#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
591 Unchecked = false;
592#endif
593 return HasError ? Error(std::move(*getErrorStorage())) : Error::success();
594 }
595
596 /// Returns a pointer to the stored T value.
597 pointer operator->() {
598 assertIsChecked();
599 return toPointer(getStorage());
600 }
601
602 /// Returns a const pointer to the stored T value.
603 const_pointer operator->() const {
604 assertIsChecked();
605 return toPointer(getStorage());
606 }
607
608 /// Returns a reference to the stored T value.
609 reference operator*() {
610 assertIsChecked();
611 return *getStorage();
612 }
613
614 /// Returns a const reference to the stored T value.
615 const_reference operator*() const {
616 assertIsChecked();
617 return *getStorage();
618 }
619
620private:
621 template <class T1>
622 static bool compareThisIfSameType(const T1 &a, const T1 &b) {
623 return &a == &b;
624 }
625
626 template <class T1, class T2>
627 static bool compareThisIfSameType(const T1 &, const T2 &) {
628 return false;
629 }
630
631 template <class OtherT> void moveConstruct(Expected<OtherT> &&Other) {
632 HasError = Other.HasError;
633#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
634 Unchecked = true;
635 Other.Unchecked = false;
636#endif
637
638 if (!HasError)
639 new (getStorage()) storage_type(std::move(*Other.getStorage()));
640 else
641 new (getErrorStorage()) error_type(std::move(*Other.getErrorStorage()));
642 }
643
644 template <class OtherT> void moveAssign(Expected<OtherT> &&Other) {
645 assertIsChecked();
646
647 if (compareThisIfSameType(*this, Other))
648 return;
649
650 this->~Expected();
651 new (this) Expected(std::move(Other));
652 }
653
654 pointer toPointer(pointer Val) { return Val; }
655
656 const_pointer toPointer(const_pointer Val) const { return Val; }
657
658 pointer toPointer(wrap *Val) { return &Val->get(); }
659
660 const_pointer toPointer(const wrap *Val) const { return &Val->get(); }
661
662 storage_type *getStorage() {
663 assert(!HasError && "Cannot get value when an error exists!")(static_cast<void> (0));
664 return reinterpret_cast<storage_type *>(&TStorage);
665 }
666
667 const storage_type *getStorage() const {
668 assert(!HasError && "Cannot get value when an error exists!")(static_cast<void> (0));
669 return reinterpret_cast<const storage_type *>(&TStorage);
670 }
671
672 error_type *getErrorStorage() {
673 assert(HasError && "Cannot get error when a value exists!")(static_cast<void> (0));
674 return reinterpret_cast<error_type *>(&ErrorStorage);
675 }
676
677 const error_type *getErrorStorage() const {
678 assert(HasError && "Cannot get error when a value exists!")(static_cast<void> (0));
679 return reinterpret_cast<const error_type *>(&ErrorStorage);
680 }
681
682 // Used by ExpectedAsOutParameter to reset the checked flag.
683 void setUnchecked() {
684#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
685 Unchecked = true;
686#endif
687 }
688
689#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
690 [[noreturn]] LLVM_ATTRIBUTE_NOINLINE__attribute__((noinline)) void fatalUncheckedExpected() const {
691 dbgs() << "Expected<T> must be checked before access or destruction.\n";
692 if (HasError) {
693 dbgs() << "Unchecked Expected<T> contained error:\n";
694 (*getErrorStorage())->log(dbgs());
695 } else
696 dbgs() << "Expected<T> value was in success state. (Note: Expected<T> "
697 "values in success mode must still be checked prior to being "
698 "destroyed).\n";
699 abort();
700 }
701#endif
702
703 void assertIsChecked() const {
704#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
705 if (LLVM_UNLIKELY(Unchecked)__builtin_expect((bool)(Unchecked), false))
706 fatalUncheckedExpected();
707#endif
708 }
709
710 union {
711 AlignedCharArrayUnion<storage_type> TStorage;
712 AlignedCharArrayUnion<error_type> ErrorStorage;
713 };
714 bool HasError : 1;
715#if LLVM_ENABLE_ABI_BREAKING_CHECKS0
716 bool Unchecked : 1;
717#endif
718};
719
720/// Report a serious error, calling any installed error handler. See
721/// ErrorHandling.h.
722[[noreturn]] void report_fatal_error(Error Err, bool gen_crash_diag = true);
723
724/// Report a fatal error if Err is a failure value.
725///
726/// This function can be used to wrap calls to fallible functions ONLY when it
727/// is known that the Error will always be a success value. E.g.
728///
729/// @code{.cpp}
730/// // foo only attempts the fallible operation if DoFallibleOperation is
731/// // true. If DoFallibleOperation is false then foo always returns
732/// // Error::success().
733/// Error foo(bool DoFallibleOperation);
734///
735/// cantFail(foo(false));
736/// @endcode
737inline void cantFail(Error Err, const char *Msg = nullptr) {
738 if (Err) {
739 if (!Msg)
740 Msg = "Failure value returned from cantFail wrapped call";
741#ifndef NDEBUG1
742 std::string Str;
743 raw_string_ostream OS(Str);
744 OS << Msg << "\n" << Err;
745 Msg = OS.str().c_str();
746#endif
747 llvm_unreachable(Msg)__builtin_unreachable();
748 }
749}
750
751/// Report a fatal error if ValOrErr is a failure value, otherwise unwraps and
752/// returns the contained value.
753///
754/// This function can be used to wrap calls to fallible functions ONLY when it
755/// is known that the Error will always be a success value. E.g.
756///
757/// @code{.cpp}
758/// // foo only attempts the fallible operation if DoFallibleOperation is
759/// // true. If DoFallibleOperation is false then foo always returns an int.
760/// Expected<int> foo(bool DoFallibleOperation);
761///
762/// int X = cantFail(foo(false));
763/// @endcode
764template <typename T>
765T cantFail(Expected<T> ValOrErr, const char *Msg = nullptr) {
766 if (ValOrErr)
767 return std::move(*ValOrErr);
768 else {
769 if (!Msg)
770 Msg = "Failure value returned from cantFail wrapped call";
771#ifndef NDEBUG1
772 std::string Str;
773 raw_string_ostream OS(Str);
774 auto E = ValOrErr.takeError();
775 OS << Msg << "\n" << E;
776 Msg = OS.str().c_str();
777#endif
778 llvm_unreachable(Msg)__builtin_unreachable();
779 }
780}
781
782/// Report a fatal error if ValOrErr is a failure value, otherwise unwraps and
783/// returns the contained reference.
784///
785/// This function can be used to wrap calls to fallible functions ONLY when it
786/// is known that the Error will always be a success value. E.g.
787///
788/// @code{.cpp}
789/// // foo only attempts the fallible operation if DoFallibleOperation is
790/// // true. If DoFallibleOperation is false then foo always returns a Bar&.
791/// Expected<Bar&> foo(bool DoFallibleOperation);
792///
793/// Bar &X = cantFail(foo(false));
794/// @endcode
795template <typename T>
796T& cantFail(Expected<T&> ValOrErr, const char *Msg = nullptr) {
797 if (ValOrErr)
798 return *ValOrErr;
799 else {
800 if (!Msg)
801 Msg = "Failure value returned from cantFail wrapped call";
802#ifndef NDEBUG1
803 std::string Str;
804 raw_string_ostream OS(Str);
805 auto E = ValOrErr.takeError();
806 OS << Msg << "\n" << E;
807 Msg = OS.str().c_str();
808#endif
809 llvm_unreachable(Msg)__builtin_unreachable();
810 }
811}
812
813/// Helper for testing applicability of, and applying, handlers for
814/// ErrorInfo types.
815template <typename HandlerT>
816class ErrorHandlerTraits
817 : public ErrorHandlerTraits<decltype(
818 &std::remove_reference<HandlerT>::type::operator())> {};
819
820// Specialization functions of the form 'Error (const ErrT&)'.
821template <typename ErrT> class ErrorHandlerTraits<Error (&)(ErrT &)> {
822public:
823 static bool appliesTo(const ErrorInfoBase &E) {
824 return E.template isA<ErrT>();
825 }
826
827 template <typename HandlerT>
828 static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
829 assert(appliesTo(*E) && "Applying incorrect handler")(static_cast<void> (0));
830 return H(static_cast<ErrT &>(*E));
831 }
832};
833
834// Specialization functions of the form 'void (const ErrT&)'.
835template <typename ErrT> class ErrorHandlerTraits<void (&)(ErrT &)> {
836public:
837 static bool appliesTo(const ErrorInfoBase &E) {
838 return E.template isA<ErrT>();
839 }
840
841 template <typename HandlerT>
842 static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
843 assert(appliesTo(*E) && "Applying incorrect handler")(static_cast<void> (0));
844 H(static_cast<ErrT &>(*E));
845 return Error::success();
846 }
847};
848
849/// Specialization for functions of the form 'Error (std::unique_ptr<ErrT>)'.
850template <typename ErrT>
851class ErrorHandlerTraits<Error (&)(std::unique_ptr<ErrT>)> {
852public:
853 static bool appliesTo(const ErrorInfoBase &E) {
854 return E.template isA<ErrT>();
855 }
856
857 template <typename HandlerT>
858 static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
859 assert(appliesTo(*E) && "Applying incorrect handler")(static_cast<void> (0));
860 std::unique_ptr<ErrT> SubE(static_cast<ErrT *>(E.release()));
861 return H(std::move(SubE));
862 }
863};
864
865/// Specialization for functions of the form 'void (std::unique_ptr<ErrT>)'.
866template <typename ErrT>
867class ErrorHandlerTraits<void (&)(std::unique_ptr<ErrT>)> {
868public:
869 static bool appliesTo(const ErrorInfoBase &E) {
870 return E.template isA<ErrT>();
871 }
872
873 template <typename HandlerT>
874 static Error apply(HandlerT &&H, std::unique_ptr<ErrorInfoBase> E) {
875 assert(appliesTo(*E) && "Applying incorrect handler")(static_cast<void> (0));
876 std::unique_ptr<ErrT> SubE(static_cast<ErrT *>(E.release()));
877 H(std::move(SubE));
878 return Error::success();
879 }
880};
881
882// Specialization for member functions of the form 'RetT (const ErrT&)'.
883template <typename C, typename RetT, typename ErrT>
884class ErrorHandlerTraits<RetT (C::*)(ErrT &)>
885 : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
886
887// Specialization for member functions of the form 'RetT (const ErrT&) const'.
888template <typename C, typename RetT, typename ErrT>
889class ErrorHandlerTraits<RetT (C::*)(ErrT &) const>
890 : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
891
892// Specialization for member functions of the form 'RetT (const ErrT&)'.
893template <typename C, typename RetT, typename ErrT>
894class ErrorHandlerTraits<RetT (C::*)(const ErrT &)>
895 : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
896
897// Specialization for member functions of the form 'RetT (const ErrT&) const'.
898template <typename C, typename RetT, typename ErrT>
899class ErrorHandlerTraits<RetT (C::*)(const ErrT &) const>
900 : public ErrorHandlerTraits<RetT (&)(ErrT &)> {};
901
902/// Specialization for member functions of the form
903/// 'RetT (std::unique_ptr<ErrT>)'.
904template <typename C, typename RetT, typename ErrT>
905class ErrorHandlerTraits<RetT (C::*)(std::unique_ptr<ErrT>)>
906 : public ErrorHandlerTraits<RetT (&)(std::unique_ptr<ErrT>)> {};
907
908/// Specialization for member functions of the form
909/// 'RetT (std::unique_ptr<ErrT>) const'.
910template <typename C, typename RetT, typename ErrT>
911class ErrorHandlerTraits<RetT (C::*)(std::unique_ptr<ErrT>) const>
912 : public ErrorHandlerTraits<RetT (&)(std::unique_ptr<ErrT>)> {};
913
914inline Error handleErrorImpl(std::unique_ptr<ErrorInfoBase> Payload) {
915 return Error(std::move(Payload));
916}
917
918template <typename HandlerT, typename... HandlerTs>
919Error handleErrorImpl(std::unique_ptr<ErrorInfoBase> Payload,
920 HandlerT &&Handler, HandlerTs &&... Handlers) {
921 if (ErrorHandlerTraits<HandlerT>::appliesTo(*Payload))
922 return ErrorHandlerTraits<HandlerT>::apply(std::forward<HandlerT>(Handler),
923 std::move(Payload));
924 return handleErrorImpl(std::move(Payload),
925 std::forward<HandlerTs>(Handlers)...);
926}
927
928/// Pass the ErrorInfo(s) contained in E to their respective handlers. Any
929/// unhandled errors (or Errors returned by handlers) are re-concatenated and
930/// returned.
931/// Because this function returns an error, its result must also be checked
932/// or returned. If you intend to handle all errors use handleAllErrors
933/// (which returns void, and will abort() on unhandled errors) instead.
934template <typename... HandlerTs>
935Error handleErrors(Error E, HandlerTs &&... Hs) {
936 if (!E)
937 return Error::success();
938
939 std::unique_ptr<ErrorInfoBase> Payload = E.takePayload();
940
941 if (Payload->isA<ErrorList>()) {
942 ErrorList &List = static_cast<ErrorList &>(*Payload);
943 Error R;
944 for (auto &P : List.Payloads)
945 R = ErrorList::join(
946 std::move(R),
947 handleErrorImpl(std::move(P), std::forward<HandlerTs>(Hs)...));
948 return R;
949 }
950
951 return handleErrorImpl(std::move(Payload), std::forward<HandlerTs>(Hs)...);
952}
953
954/// Behaves the same as handleErrors, except that by contract all errors
955/// *must* be handled by the given handlers (i.e. there must be no remaining
956/// errors after running the handlers, or llvm_unreachable is called).
957template <typename... HandlerTs>
958void handleAllErrors(Error E, HandlerTs &&... Handlers) {
959 cantFail(handleErrors(std::move(E), std::forward<HandlerTs>(Handlers)...));
960}
961
962/// Check that E is a non-error, then drop it.
963/// If E is an error, llvm_unreachable will be called.
964inline void handleAllErrors(Error E) {
965 cantFail(std::move(E));
966}
967
968/// Handle any errors (if present) in an Expected<T>, then try a recovery path.
969///
970/// If the incoming value is a success value it is returned unmodified. If it
971/// is a failure value then it the contained error is passed to handleErrors.
972/// If handleErrors is able to handle the error then the RecoveryPath functor
973/// is called to supply the final result. If handleErrors is not able to
974/// handle all errors then the unhandled errors are returned.
975///
976/// This utility enables the follow pattern:
977///
978/// @code{.cpp}
979/// enum FooStrategy { Aggressive, Conservative };
980/// Expected<Foo> foo(FooStrategy S);
981///
982/// auto ResultOrErr =
983/// handleExpected(
984/// foo(Aggressive),
985/// []() { return foo(Conservative); },
986/// [](AggressiveStrategyError&) {
987/// // Implicitly conusme this - we'll recover by using a conservative
988/// // strategy.
989/// });
990///
991/// @endcode
992template <typename T, typename RecoveryFtor, typename... HandlerTs>
993Expected<T> handleExpected(Expected<T> ValOrErr, RecoveryFtor &&RecoveryPath,
994 HandlerTs &&... Handlers) {
995 if (ValOrErr)
996 return ValOrErr;
997
998 if (auto Err = handleErrors(ValOrErr.takeError(),
999 std::forward<HandlerTs>(Handlers)...))
1000 return std::move(Err);
1001
1002 return RecoveryPath();
1003}
1004
1005/// Log all errors (if any) in E to OS. If there are any errors, ErrorBanner
1006/// will be printed before the first one is logged. A newline will be printed
1007/// after each error.
1008///
1009/// This function is compatible with the helpers from Support/WithColor.h. You
1010/// can pass any of them as the OS. Please consider using them instead of
1011/// including 'error: ' in the ErrorBanner.
1012///
1013/// This is useful in the base level of your program to allow clean termination
1014/// (allowing clean deallocation of resources, etc.), while reporting error
1015/// information to the user.
1016void logAllUnhandledErrors(Error E, raw_ostream &OS, Twine ErrorBanner = {});
1017
1018/// Write all error messages (if any) in E to a string. The newline character
1019/// is used to separate error messages.
1020inline std::string toString(Error E) {
1021 SmallVector<std::string, 2> Errors;
1022 handleAllErrors(std::move(E), [&Errors](const ErrorInfoBase &EI) {
1023 Errors.push_back(EI.message());
1024 });
1025 return join(Errors.begin(), Errors.end(), "\n");
1026}
1027
1028/// Consume a Error without doing anything. This method should be used
1029/// only where an error can be considered a reasonable and expected return
1030/// value.
1031///
1032/// Uses of this method are potentially indicative of design problems: If it's
1033/// legitimate to do nothing while processing an "error", the error-producer
1034/// might be more clearly refactored to return an Optional<T>.
1035inline void consumeError(Error Err) {
1036 handleAllErrors(std::move(Err), [](const ErrorInfoBase &) {});
1037}
1038
1039/// Convert an Expected to an Optional without doing anything. This method
1040/// should be used only where an error can be considered a reasonable and
1041/// expected return value.
1042///
1043/// Uses of this method are potentially indicative of problems: perhaps the
1044/// error should be propagated further, or the error-producer should just
1045/// return an Optional in the first place.
1046template <typename T> Optional<T> expectedToOptional(Expected<T> &&E) {
1047 if (E)
1048 return std::move(*E);
1049 consumeError(E.takeError());
1050 return None;
1051}
1052
1053/// Helper for converting an Error to a bool.
1054///
1055/// This method returns true if Err is in an error state, or false if it is
1056/// in a success state. Puts Err in a checked state in both cases (unlike
1057/// Error::operator bool(), which only does this for success states).
1058inline bool errorToBool(Error Err) {
1059 bool IsError = static_cast<bool>(Err);
1060 if (IsError)
1061 consumeError(std::move(Err));
1062 return IsError;
1063}
1064
1065/// Helper for Errors used as out-parameters.
1066///
1067/// This helper is for use with the Error-as-out-parameter idiom, where an error
1068/// is passed to a function or method by reference, rather than being returned.
1069/// In such cases it is helpful to set the checked bit on entry to the function
1070/// so that the error can be written to (unchecked Errors abort on assignment)
1071/// and clear the checked bit on exit so that clients cannot accidentally forget
1072/// to check the result. This helper performs these actions automatically using
1073/// RAII:
1074///
1075/// @code{.cpp}
1076/// Result foo(Error &Err) {
1077/// ErrorAsOutParameter ErrAsOutParam(&Err); // 'Checked' flag set
1078/// // <body of foo>
1079/// // <- 'Checked' flag auto-cleared when ErrAsOutParam is destructed.
1080/// }
1081/// @endcode
1082///
1083/// ErrorAsOutParameter takes an Error* rather than Error& so that it can be
1084/// used with optional Errors (Error pointers that are allowed to be null). If
1085/// ErrorAsOutParameter took an Error reference, an instance would have to be
1086/// created inside every condition that verified that Error was non-null. By
1087/// taking an Error pointer we can just create one instance at the top of the
1088/// function.
1089class ErrorAsOutParameter {
1090public:
1091 ErrorAsOutParameter(Error *Err) : Err(Err) {
1092 // Raise the checked bit if Err is success.
1093 if (Err)
1094 (void)!!*Err;
1095 }
1096
1097 ~ErrorAsOutParameter() {
1098 // Clear the checked bit.
1099 if (Err && !*Err)
1100 *Err = Error::success();
1101 }
1102
1103private:
1104 Error *Err;
1105};
1106
1107/// Helper for Expected<T>s used as out-parameters.
1108///
1109/// See ErrorAsOutParameter.
1110template <typename T>
1111class ExpectedAsOutParameter {
1112public:
1113 ExpectedAsOutParameter(Expected<T> *ValOrErr)
1114 : ValOrErr(ValOrErr) {
1115 if (ValOrErr)
1116 (void)!!*ValOrErr;
1117 }
1118
1119 ~ExpectedAsOutParameter() {
1120 if (ValOrErr)
1121 ValOrErr->setUnchecked();
1122 }
1123
1124private:
1125 Expected<T> *ValOrErr;
1126};
1127
1128/// This class wraps a std::error_code in a Error.
1129///
1130/// This is useful if you're writing an interface that returns a Error
1131/// (or Expected) and you want to call code that still returns
1132/// std::error_codes.
1133class ECError : public ErrorInfo<ECError> {
1134 friend Error errorCodeToError(std::error_code);
1135
1136 virtual void anchor() override;
1137
1138public:
1139 void setErrorCode(std::error_code EC) { this->EC = EC; }
1140 std::error_code convertToErrorCode() const override { return EC; }
1141 void log(raw_ostream &OS) const override { OS << EC.message(); }
1142
1143 // Used by ErrorInfo::classID.
1144 static char ID;
1145
1146protected:
1147 ECError() = default;
1148 ECError(std::error_code EC) : EC(EC) {}
1149
1150 std::error_code EC;
1151};
1152
1153/// The value returned by this function can be returned from convertToErrorCode
1154/// for Error values where no sensible translation to std::error_code exists.
1155/// It should only be used in this situation, and should never be used where a
1156/// sensible conversion to std::error_code is available, as attempts to convert
1157/// to/from this error will result in a fatal error. (i.e. it is a programmatic
1158///error to try to convert such a value).
1159std::error_code inconvertibleErrorCode();
1160
1161/// Helper for converting an std::error_code to a Error.
1162Error errorCodeToError(std::error_code EC);
1163
1164/// Helper for converting an ECError to a std::error_code.
1165///
1166/// This method requires that Err be Error() or an ECError, otherwise it
1167/// will trigger a call to abort().
1168std::error_code errorToErrorCode(Error Err);
1169
1170/// Convert an ErrorOr<T> to an Expected<T>.
1171template <typename T> Expected<T> errorOrToExpected(ErrorOr<T> &&EO) {
1172 if (auto EC = EO.getError())
1173 return errorCodeToError(EC);
1174 return std::move(*EO);
1175}
1176
1177/// Convert an Expected<T> to an ErrorOr<T>.
1178template <typename T> ErrorOr<T> expectedToErrorOr(Expected<T> &&E) {
1179 if (auto Err = E.takeError())
1180 return errorToErrorCode(std::move(Err));
1181 return std::move(*E);
1182}
1183
1184/// This class wraps a string in an Error.
1185///
1186/// StringError is useful in cases where the client is not expected to be able
1187/// to consume the specific error message programmatically (for example, if the
1188/// error message is to be presented to the user).
1189///
1190/// StringError can also be used when additional information is to be printed
1191/// along with a error_code message. Depending on the constructor called, this
1192/// class can either display:
1193/// 1. the error_code message (ECError behavior)
1194/// 2. a string
1195/// 3. the error_code message and a string
1196///
1197/// These behaviors are useful when subtyping is required; for example, when a
1198/// specific library needs an explicit error type. In the example below,
1199/// PDBError is derived from StringError:
1200///
1201/// @code{.cpp}
1202/// Expected<int> foo() {
1203/// return llvm::make_error<PDBError>(pdb_error_code::dia_failed_loading,
1204/// "Additional information");
1205/// }
1206/// @endcode
1207///
1208class StringError : public ErrorInfo<StringError> {
1209public:
1210 static char ID;
1211
1212 // Prints EC + S and converts to EC
1213 StringError(std::error_code EC, const Twine &S = Twine());
1214
1215 // Prints S and converts to EC
1216 StringError(const Twine &S, std::error_code EC);
1217
1218 void log(raw_ostream &OS) const override;
1219 std::error_code convertToErrorCode() const override;
1220
1221 const std::string &getMessage() const { return Msg; }
1222
1223private:
1224 std::string Msg;
1225 std::error_code EC;
1226 const bool PrintMsgOnly = false;
1227};
1228
1229/// Create formatted StringError object.
1230template <typename... Ts>
1231inline Error createStringError(std::error_code EC, char const *Fmt,
1232 const Ts &... Vals) {
1233 std::string Buffer;
1234 raw_string_ostream Stream(Buffer);
1235 Stream << format(Fmt, Vals...);
1236 return make_error<StringError>(Stream.str(), EC);
19
Calling 'make_error<llvm::StringError, std::basic_string<char> &, std::error_code &>'
23
Returned allocated memory
1237}
1238
1239Error createStringError(std::error_code EC, char const *Msg);
1240
1241inline Error createStringError(std::error_code EC, const Twine &S) {
1242 return createStringError(EC, S.str().c_str());
1243}
1244
1245template <typename... Ts>
1246inline Error createStringError(std::errc EC, char const *Fmt,
1247 const Ts &... Vals) {
1248 return createStringError(std::make_error_code(EC), Fmt, Vals...);
18
Calling 'createStringError<unsigned int>'
24
Returned allocated memory
1249}
1250
1251/// This class wraps a filename and another Error.
1252///
1253/// In some cases, an error needs to live along a 'source' name, in order to
1254/// show more detailed information to the user.
1255class FileError final : public ErrorInfo<FileError> {
1256
1257 friend Error createFileError(const Twine &, Error);
1258 friend Error createFileError(const Twine &, size_t, Error);
1259
1260public:
1261 void log(raw_ostream &OS) const override {
1262 assert(Err && !FileName.empty() && "Trying to log after takeError().")(static_cast<void> (0));
1263 OS << "'" << FileName << "': ";
1264 if (Line.hasValue())
1265 OS << "line " << Line.getValue() << ": ";
1266 Err->log(OS);
1267 }
1268
1269 StringRef getFileName() { return FileName; }
1270
1271 Error takeError() { return Error(std::move(Err)); }
1272
1273 std::error_code convertToErrorCode() const override;
1274
1275 // Used by ErrorInfo::classID.
1276 static char ID;
1277
1278private:
1279 FileError(const Twine &F, Optional<size_t> LineNum,
1280 std::unique_ptr<ErrorInfoBase> E) {
1281 assert(E && "Cannot create FileError from Error success value.")(static_cast<void> (0));
1282 assert(!F.isTriviallyEmpty() &&(static_cast<void> (0))
1283 "The file name provided to FileError must not be empty.")(static_cast<void> (0));
1284 FileName = F.str();
1285 Err = std::move(E);
1286 Line = std::move(LineNum);
1287 }
1288
1289 static Error build(const Twine &F, Optional<size_t> Line, Error E) {
1290 std::unique_ptr<ErrorInfoBase> Payload;
1291 handleAllErrors(std::move(E),
1292 [&](std::unique_ptr<ErrorInfoBase> EIB) -> Error {
1293 Payload = std::move(EIB);
1294 return Error::success();
1295 });
1296 return Error(
1297 std::unique_ptr<FileError>(new FileError(F, Line, std::move(Payload))));
1298 }
1299
1300 std::string FileName;
1301 Optional<size_t> Line;
1302 std::unique_ptr<ErrorInfoBase> Err;
1303};
1304
1305/// Concatenate a source file path and/or name with an Error. The resulting
1306/// Error is unchecked.
1307inline Error createFileError(const Twine &F, Error E) {
1308 return FileError::build(F, Optional<size_t>(), std::move(E));
1309}
1310
1311/// Concatenate a source file path and/or name with line number and an Error.
1312/// The resulting Error is unchecked.
1313inline Error createFileError(const Twine &F, size_t Line, Error E) {
1314 return FileError::build(F, Optional<size_t>(Line), std::move(E));
1315}
1316
1317/// Concatenate a source file path and/or name with a std::error_code
1318/// to form an Error object.
1319inline Error createFileError(const Twine &F, std::error_code EC) {
1320 return createFileError(F, errorCodeToError(EC));
1321}
1322
1323/// Concatenate a source file path and/or name with line number and
1324/// std::error_code to form an Error object.
1325inline Error createFileError(const Twine &F, size_t Line, std::error_code EC) {
1326 return createFileError(F, Line, errorCodeToError(EC));
1327}
1328
1329Error createFileError(const Twine &F, ErrorSuccess) = delete;
1330
1331/// Helper for check-and-exit error handling.
1332///
1333/// For tool use only. NOT FOR USE IN LIBRARY CODE.
1334///
1335class ExitOnError {
1336public:
1337 /// Create an error on exit helper.
1338 ExitOnError(std::string Banner = "", int DefaultErrorExitCode = 1)
1339 : Banner(std::move(Banner)),
1340 GetExitCode([=](const Error &) { return DefaultErrorExitCode; }) {}
1341
1342 /// Set the banner string for any errors caught by operator().
1343 void setBanner(std::string Banner) { this->Banner = std::move(Banner); }
1344
1345 /// Set the exit-code mapper function.
1346 void setExitCodeMapper(std::function<int(const Error &)> GetExitCode) {
1347 this->GetExitCode = std::move(GetExitCode);
1348 }
1349
1350 /// Check Err. If it's in a failure state log the error(s) and exit.
1351 void operator()(Error Err) const { checkError(std::move(Err)); }
1352
1353 /// Check E. If it's in a success state then return the contained value. If
1354 /// it's in a failure state log the error(s) and exit.
1355 template <typename T> T operator()(Expected<T> &&E) const {
1356 checkError(E.takeError());
1357 return std::move(*E);
1358 }
1359
1360 /// Check E. If it's in a success state then return the contained reference. If
1361 /// it's in a failure state log the error(s) and exit.
1362 template <typename T> T& operator()(Expected<T&> &&E) const {
1363 checkError(E.takeError());
1364 return *E;
1365 }
1366
1367private:
1368 void checkError(Error Err) const {
1369 if (Err) {
1370 int ExitCode = GetExitCode(Err);
1371 logAllUnhandledErrors(std::move(Err), errs(), Banner);
1372 exit(ExitCode);
1373 }
1374 }
1375
1376 std::string Banner;
1377 std::function<int(const Error &)> GetExitCode;
1378};
1379
1380/// Conversion from Error to LLVMErrorRef for C error bindings.
1381inline LLVMErrorRef wrap(Error Err) {
1382 return reinterpret_cast<LLVMErrorRef>(Err.takePayload().release());
1383}
1384
1385/// Conversion from LLVMErrorRef to Error for C error bindings.
1386inline Error unwrap(LLVMErrorRef ErrRef) {
1387 return Error(std::unique_ptr<ErrorInfoBase>(
1388 reinterpret_cast<ErrorInfoBase *>(ErrRef)));
1389}
1390
1391} // end namespace llvm
1392
1393#endif // LLVM_SUPPORT_ERROR_H

/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/unique_ptr.h

1// unique_ptr implementation -*- C++ -*-
2
3// Copyright (C) 2008-2020 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file bits/unique_ptr.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{memory}
28 */
29
30#ifndef _UNIQUE_PTR_H1
31#define _UNIQUE_PTR_H1 1
32
33#include <bits/c++config.h>
34#include <debug/assertions.h>
35#include <type_traits>
36#include <utility>
37#include <tuple>
38#include <bits/stl_function.h>
39#include <bits/functional_hash.h>
40#if __cplusplus201402L > 201703L
41# include <compare>
42# include <ostream>
43#endif
44
45namespace std _GLIBCXX_VISIBILITY(default)__attribute__ ((__visibility__ ("default")))
46{
47_GLIBCXX_BEGIN_NAMESPACE_VERSION
48
49 /**
50 * @addtogroup pointer_abstractions
51 * @{
52 */
53
54#if _GLIBCXX_USE_DEPRECATED1
55#pragma GCC diagnostic push
56#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
57 template<typename> class auto_ptr;
58#pragma GCC diagnostic pop
59#endif
60
61 /// Primary template of default_delete, used by unique_ptr for single objects
62 template<typename _Tp>
63 struct default_delete
64 {
65 /// Default constructor
66 constexpr default_delete() noexcept = default;
67
68 /** @brief Converting constructor.
69 *
70 * Allows conversion from a deleter for objects of another type, `_Up`,
71 * only if `_Up*` is convertible to `_Tp*`.
72 */
73 template<typename _Up,
74 typename = _Require<is_convertible<_Up*, _Tp*>>>
75 default_delete(const default_delete<_Up>&) noexcept { }
76
77 /// Calls `delete __ptr`
78 void
79 operator()(_Tp* __ptr) const
80 {
81 static_assert(!is_void<_Tp>::value,
82 "can't delete pointer to incomplete type");
83 static_assert(sizeof(_Tp)>0,
84 "can't delete pointer to incomplete type");
85 delete __ptr;
86 }
87 };
88
89 // _GLIBCXX_RESOLVE_LIB_DEFECTS
90 // DR 740 - omit specialization for array objects with a compile time length
91
92 /// Specialization of default_delete for arrays, used by `unique_ptr<T[]>`
93 template<typename _Tp>
94 struct default_delete<_Tp[]>
95 {
96 public:
97 /// Default constructor
98 constexpr default_delete() noexcept = default;
99
100 /** @brief Converting constructor.
101 *
102 * Allows conversion from a deleter for arrays of another type, such as
103 * a const-qualified version of `_Tp`.
104 *
105 * Conversions from types derived from `_Tp` are not allowed because
106 * it is undefined to `delete[]` an array of derived types through a
107 * pointer to the base type.
108 */
109 template<typename _Up,
110 typename = _Require<is_convertible<_Up(*)[], _Tp(*)[]>>>
111 default_delete(const default_delete<_Up[]>&) noexcept { }
112
113 /// Calls `delete[] __ptr`
114 template<typename _Up>
115 typename enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value>::type
116 operator()(_Up* __ptr) const
117 {
118 static_assert(sizeof(_Tp)>0,
119 "can't delete pointer to incomplete type");
120 delete [] __ptr;
121 }
122 };
123
124 /// @cond undocumented
125
126 // Manages the pointer and deleter of a unique_ptr
127 template <typename _Tp, typename _Dp>
128 class __uniq_ptr_impl
129 {
130 template <typename _Up, typename _Ep, typename = void>
131 struct _Ptr
132 {
133 using type = _Up*;
134 };
135
136 template <typename _Up, typename _Ep>
137 struct
138 _Ptr<_Up, _Ep, __void_t<typename remove_reference<_Ep>::type::pointer>>
139 {
140 using type = typename remove_reference<_Ep>::type::pointer;
141 };
142
143 public:
144 using _DeleterConstraint = enable_if<
145 __and_<__not_<is_pointer<_Dp>>,
146 is_default_constructible<_Dp>>::value>;
147
148 using pointer = typename _Ptr<_Tp, _Dp>::type;
149
150 static_assert( !is_rvalue_reference<_Dp>::value,
151 "unique_ptr's deleter type must be a function object type"
152 " or an lvalue reference type" );
153
154 __uniq_ptr_impl() = default;
155 __uniq_ptr_impl(pointer __p) : _M_t() { _M_ptr() = __p; }
156
157 template<typename _Del>
158 __uniq_ptr_impl(pointer __p, _Del&& __d)
159 : _M_t(__p, std::forward<_Del>(__d)) { }
160
161 __uniq_ptr_impl(__uniq_ptr_impl&& __u) noexcept
162 : _M_t(std::move(__u._M_t))
163 { __u._M_ptr() = nullptr; }
164
165 __uniq_ptr_impl& operator=(__uniq_ptr_impl&& __u) noexcept
166 {
167 reset(__u.release());
168 _M_deleter() = std::forward<_Dp>(__u._M_deleter());
169 return *this;
170 }
171
172 pointer& _M_ptr() { return std::get<0>(_M_t); }
173 pointer _M_ptr() const { return std::get<0>(_M_t); }
174 _Dp& _M_deleter() { return std::get<1>(_M_t); }
175 const _Dp& _M_deleter() const { return std::get<1>(_M_t); }
176
177 void reset(pointer __p) noexcept
178 {
179 const pointer __old_p = _M_ptr();
180 _M_ptr() = __p;
181 if (__old_p)
182 _M_deleter()(__old_p);
183 }
184
185 pointer release() noexcept
186 {
187 pointer __p = _M_ptr();
188 _M_ptr() = nullptr;
189 return __p;
190 }
191
192 void
193 swap(__uniq_ptr_impl& __rhs) noexcept
194 {
195 using std::swap;
196 swap(this->_M_ptr(), __rhs._M_ptr());
197 swap(this->_M_deleter(), __rhs._M_deleter());
198 }
199
200 private:
201 tuple<pointer, _Dp> _M_t;
202 };
203
204 // Defines move construction + assignment as either defaulted or deleted.
205 template <typename _Tp, typename _Dp,
206 bool = is_move_constructible<_Dp>::value,
207 bool = is_move_assignable<_Dp>::value>
208 struct __uniq_ptr_data : __uniq_ptr_impl<_Tp, _Dp>
209 {
210 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
211 __uniq_ptr_data(__uniq_ptr_data&&) = default;
212 __uniq_ptr_data& operator=(__uniq_ptr_data&&) = default;
213 };
214
215 template <typename _Tp, typename _Dp>
216 struct __uniq_ptr_data<_Tp, _Dp, true, false> : __uniq_ptr_impl<_Tp, _Dp>
217 {
218 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
219 __uniq_ptr_data(__uniq_ptr_data&&) = default;
220 __uniq_ptr_data& operator=(__uniq_ptr_data&&) = delete;
221 };
222
223 template <typename _Tp, typename _Dp>
224 struct __uniq_ptr_data<_Tp, _Dp, false, true> : __uniq_ptr_impl<_Tp, _Dp>
225 {
226 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
227 __uniq_ptr_data(__uniq_ptr_data&&) = delete;
228 __uniq_ptr_data& operator=(__uniq_ptr_data&&) = default;
229 };
230
231 template <typename _Tp, typename _Dp>
232 struct __uniq_ptr_data<_Tp, _Dp, false, false> : __uniq_ptr_impl<_Tp, _Dp>
233 {
234 using __uniq_ptr_impl<_Tp, _Dp>::__uniq_ptr_impl;
235 __uniq_ptr_data(__uniq_ptr_data&&) = delete;
236 __uniq_ptr_data& operator=(__uniq_ptr_data&&) = delete;
237 };
238 /// @endcond
239
240 /// 20.7.1.2 unique_ptr for single objects.
241 template <typename _Tp, typename _Dp = default_delete<_Tp>>
242 class unique_ptr
243 {
244 template <typename _Up>
245 using _DeleterConstraint =
246 typename __uniq_ptr_impl<_Tp, _Up>::_DeleterConstraint::type;
247
248 __uniq_ptr_data<_Tp, _Dp> _M_t;
249
250 public:
251 using pointer = typename __uniq_ptr_impl<_Tp, _Dp>::pointer;
252 using element_type = _Tp;
253 using deleter_type = _Dp;
254
255 private:
256 // helper template for detecting a safe conversion from another
257 // unique_ptr
258 template<typename _Up, typename _Ep>
259 using __safe_conversion_up = __and_<
260 is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>,
261 __not_<is_array<_Up>>
262 >;
263
264 public:
265 // Constructors.
266
267 /// Default constructor, creates a unique_ptr that owns nothing.
268 template<typename _Del = _Dp, typename = _DeleterConstraint<_Del>>
269 constexpr unique_ptr() noexcept
270 : _M_t()
271 { }
272
273 /** Takes ownership of a pointer.
274 *
275 * @param __p A pointer to an object of @c element_type
276 *
277 * The deleter will be value-initialized.
278 */
279 template<typename _Del = _Dp, typename = _DeleterConstraint<_Del>>
280 explicit
281 unique_ptr(pointer __p) noexcept
282 : _M_t(__p)
283 { }
284
285 /** Takes ownership of a pointer.
286 *
287 * @param __p A pointer to an object of @c element_type
288 * @param __d A reference to a deleter.
289 *
290 * The deleter will be initialized with @p __d
291 */
292 template<typename _Del = deleter_type,
293 typename = _Require<is_copy_constructible<_Del>>>
294 unique_ptr(pointer __p, const deleter_type& __d) noexcept
295 : _M_t(__p, __d) { }
296
297 /** Takes ownership of a pointer.
298 *
299 * @param __p A pointer to an object of @c element_type
300 * @param __d An rvalue reference to a (non-reference) deleter.
301 *
302 * The deleter will be initialized with @p std::move(__d)
303 */
304 template<typename _Del = deleter_type,
305 typename = _Require<is_move_constructible<_Del>>>
306 unique_ptr(pointer __p,
307 __enable_if_t<!is_lvalue_reference<_Del>::value,
308 _Del&&> __d) noexcept
309 : _M_t(__p, std::move(__d))
310 { }
311
312 template<typename _Del = deleter_type,
313 typename _DelUnref = typename remove_reference<_Del>::type>
314 unique_ptr(pointer,
315 __enable_if_t<is_lvalue_reference<_Del>::value,
316 _DelUnref&&>) = delete;
317
318 /// Creates a unique_ptr that owns nothing.
319 template<typename _Del = _Dp, typename = _DeleterConstraint<_Del>>
320 constexpr unique_ptr(nullptr_t) noexcept
321 : _M_t()
322 { }
323
324 // Move constructors.
325
326 /// Move constructor.
327 unique_ptr(unique_ptr&&) = default;
328
329 /** @brief Converting constructor from another type
330 *
331 * Requires that the pointer owned by @p __u is convertible to the
332 * type of pointer owned by this object, @p __u does not own an array,
333 * and @p __u has a compatible deleter type.
334 */
335 template<typename _Up, typename _Ep, typename = _Require<
336 __safe_conversion_up<_Up, _Ep>,
337 typename conditional<is_reference<_Dp>::value,
338 is_same<_Ep, _Dp>,
339 is_convertible<_Ep, _Dp>>::type>>
340 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
341 : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
342 { }
343
344#if _GLIBCXX_USE_DEPRECATED1
345#pragma GCC diagnostic push
346#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
347 /// Converting constructor from @c auto_ptr
348 template<typename _Up, typename = _Require<
349 is_convertible<_Up*, _Tp*>, is_same<_Dp, default_delete<_Tp>>>>
350 unique_ptr(auto_ptr<_Up>&& __u) noexcept;
351#pragma GCC diagnostic pop
352#endif
353
354 /// Destructor, invokes the deleter if the stored pointer is not null.
355 ~unique_ptr() noexcept
356 {
357 static_assert(__is_invocable<deleter_type&, pointer>::value,
358 "unique_ptr's deleter must be invocable with a pointer");
359 auto& __ptr = _M_t._M_ptr();
360 if (__ptr != nullptr)
361 get_deleter()(std::move(__ptr));
362 __ptr = pointer();
363 }
364
365 // Assignment.
366
367 /** @brief Move assignment operator.
368 *
369 * Invokes the deleter if this object owns a pointer.
370 */
371 unique_ptr& operator=(unique_ptr&&) = default;
372
373 /** @brief Assignment from another type.
374 *
375 * @param __u The object to transfer ownership from, which owns a
376 * convertible pointer to a non-array object.
377 *
378 * Invokes the deleter if this object owns a pointer.
379 */
380 template<typename _Up, typename _Ep>
381 typename enable_if< __and_<
382 __safe_conversion_up<_Up, _Ep>,
383 is_assignable<deleter_type&, _Ep&&>
384 >::value,
385 unique_ptr&>::type
386 operator=(unique_ptr<_Up, _Ep>&& __u) noexcept
387 {
388 reset(__u.release());
389 get_deleter() = std::forward<_Ep>(__u.get_deleter());
390 return *this;
391 }
392
393 /// Reset the %unique_ptr to empty, invoking the deleter if necessary.
394 unique_ptr&
395 operator=(nullptr_t) noexcept
396 {
397 reset();
398 return *this;
399 }
400
401 // Observers.
402
403 /// Dereference the stored pointer.
404 typename add_lvalue_reference<element_type>::type
405 operator*() const
406 {
407 __glibcxx_assert(get() != pointer());
408 return *get();
409 }
410
411 /// Return the stored pointer.
412 pointer
413 operator->() const noexcept
414 {
415 _GLIBCXX_DEBUG_PEDASSERT(get() != pointer());
416 return get();
417 }
418
419 /// Return the stored pointer.
420 pointer
421 get() const noexcept
422 { return _M_t._M_ptr(); }
423
424 /// Return a reference to the stored deleter.
425 deleter_type&
426 get_deleter() noexcept
427 { return _M_t._M_deleter(); }
428
429 /// Return a reference to the stored deleter.
430 const deleter_type&
431 get_deleter() const noexcept
432 { return _M_t._M_deleter(); }
433
434 /// Return @c true if the stored pointer is not null.
435 explicit operator bool() const noexcept
436 { return get() == pointer() ? false : true; }
437
438 // Modifiers.
439
440 /// Release ownership of any stored pointer.
441 pointer
442 release() noexcept
443 { return _M_t.release(); }
444
445 /** @brief Replace the stored pointer.
446 *
447 * @param __p The new pointer to store.
448 *
449 * The deleter will be invoked if a pointer is already owned.
450 */
451 void
452 reset(pointer __p = pointer()) noexcept
453 {
454 static_assert(__is_invocable<deleter_type&, pointer>::value,
455 "unique_ptr's deleter must be invocable with a pointer");
456 _M_t.reset(std::move(__p));
457 }
458
459 /// Exchange the pointer and deleter with another object.
460 void
461 swap(unique_ptr& __u) noexcept
462 {
463 static_assert(__is_swappable<_Dp>::value, "deleter must be swappable");
464 _M_t.swap(__u._M_t);
465 }
466
467 // Disable copy from lvalue.
468 unique_ptr(const unique_ptr&) = delete;
469 unique_ptr& operator=(const unique_ptr&) = delete;
470 };
471
472 /// 20.7.1.3 unique_ptr for array objects with a runtime length
473 // [unique.ptr.runtime]
474 // _GLIBCXX_RESOLVE_LIB_DEFECTS
475 // DR 740 - omit specialization for array objects with a compile time length
476 template<typename _Tp, typename _Dp>
477 class unique_ptr<_Tp[], _Dp>
478 {
479 template <typename _Up>
480 using _DeleterConstraint =
481 typename __uniq_ptr_impl<_Tp, _Up>::_DeleterConstraint::type;
482
483 __uniq_ptr_data<_Tp, _Dp> _M_t;
484
485 template<typename _Up>
486 using __remove_cv = typename remove_cv<_Up>::type;
487
488 // like is_base_of<_Tp, _Up> but false if unqualified types are the same
489 template<typename _Up>
490 using __is_derived_Tp
491 = __and_< is_base_of<_Tp, _Up>,
492 __not_<is_same<__remove_cv<_Tp>, __remove_cv<_Up>>> >;
493
494 public:
495 using pointer = typename __uniq_ptr_impl<_Tp, _Dp>::pointer;
496 using element_type = _Tp;
497 using deleter_type = _Dp;
498
499 // helper template for detecting a safe conversion from another
500 // unique_ptr
501 template<typename _Up, typename _Ep,
502 typename _UPtr = unique_ptr<_Up, _Ep>,
503 typename _UP_pointer = typename _UPtr::pointer,
504 typename _UP_element_type = typename _UPtr::element_type>
505 using __safe_conversion_up = __and_<
506 is_array<_Up>,
507 is_same<pointer, element_type*>,
508 is_same<_UP_pointer, _UP_element_type*>,
509 is_convertible<_UP_element_type(*)[], element_type(*)[]>
510 >;
511
512 // helper template for detecting a safe conversion from a raw pointer
513 template<typename _Up>
514 using __safe_conversion_raw = __and_<
515 __or_<__or_<is_same<_Up, pointer>,
516 is_same<_Up, nullptr_t>>,
517 __and_<is_pointer<_Up>,
518 is_same<pointer, element_type*>,
519 is_convertible<
520 typename remove_pointer<_Up>::type(*)[],
521 element_type(*)[]>
522 >
523 >
524 >;
525
526 // Constructors.
527
528 /// Default constructor, creates a unique_ptr that owns nothing.
529 template<typename _Del = _Dp, typename = _DeleterConstraint<_Del>>
530 constexpr unique_ptr() noexcept
531 : _M_t()
532 { }
533
534 /** Takes ownership of a pointer.
535 *
536 * @param __p A pointer to an array of a type safely convertible
537 * to an array of @c element_type
538 *
539 * The deleter will be value-initialized.
540 */
541 template<typename _Up,
542 typename _Vp = _Dp,
543 typename = _DeleterConstraint<_Vp>,
544 typename = typename enable_if<
545 __safe_conversion_raw<_Up>::value, bool>::type>
546 explicit
547 unique_ptr(_Up __p) noexcept
548 : _M_t(__p)
549 { }
550
551 /** Takes ownership of a pointer.
552 *
553 * @param __p A pointer to an array of a type safely convertible
554 * to an array of @c element_type
555 * @param __d A reference to a deleter.
556 *
557 * The deleter will be initialized with @p __d
558 */
559 template<typename _Up, typename _Del = deleter_type,
560 typename = _Require<__safe_conversion_raw<_Up>,
561 is_copy_constructible<_Del>>>
562 unique_ptr(_Up __p, const deleter_type& __d) noexcept
563 : _M_t(__p, __d) { }
564
565 /** Takes ownership of a pointer.
566 *
567 * @param __p A pointer to an array of a type safely convertible
568 * to an array of @c element_type
569 * @param __d A reference to a deleter.
570 *
571 * The deleter will be initialized with @p std::move(__d)
572 */
573 template<typename _Up, typename _Del = deleter_type,
574 typename = _Require<__safe_conversion_raw<_Up>,
575 is_move_constructible<_Del>>>
576 unique_ptr(_Up __p,
577 __enable_if_t<!is_lvalue_reference<_Del>::value,
578 _Del&&> __d) noexcept
579 : _M_t(std::move(__p), std::move(__d))
580 { }
581
582 template<typename _Up, typename _Del = deleter_type,
583 typename _DelUnref = typename remove_reference<_Del>::type,
584 typename = _Require<__safe_conversion_raw<_Up>>>
585 unique_ptr(_Up,
586 __enable_if_t<is_lvalue_reference<_Del>::value,
587 _DelUnref&&>) = delete;
588
589 /// Move constructor.
590 unique_ptr(unique_ptr&&) = default;
591
592 /// Creates a unique_ptr that owns nothing.
593 template<typename _Del = _Dp, typename = _DeleterConstraint<_Del>>
594 constexpr unique_ptr(nullptr_t) noexcept
595 : _M_t()
596 { }
597
598 template<typename _Up, typename _Ep, typename = _Require<
599 __safe_conversion_up<_Up, _Ep>,
600 typename conditional<is_reference<_Dp>::value,
601 is_same<_Ep, _Dp>,
602 is_convertible<_Ep, _Dp>>::type>>
603 unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
604 : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
605 { }
606
607 /// Destructor, invokes the deleter if the stored pointer is not null.
608 ~unique_ptr()
609 {
610 auto& __ptr = _M_t._M_ptr();
611 if (__ptr != nullptr)
612 get_deleter()(__ptr);
613 __ptr = pointer();
614 }
615
616 // Assignment.
617
618 /** @brief Move assignment operator.
619 *
620 * Invokes the deleter if this object owns a pointer.
621 */
622 unique_ptr&
623 operator=(unique_ptr&&) = default;
624
625 /** @brief Assignment from another type.
626 *
627 * @param __u The object to transfer ownership from, which owns a
628 * convertible pointer to an array object.
629 *
630 * Invokes the deleter if this object owns a pointer.
631 */
632 template<typename _Up, typename _Ep>
633 typename
634 enable_if<__and_<__safe_conversion_up<_Up, _Ep>,
635 is_assignable<deleter_type&, _Ep&&>
636 >::value,
637 unique_ptr&>::type
638 operator=(unique_ptr<_Up, _Ep>&& __u) noexcept
639 {
640 reset(__u.release());
641 get_deleter() = std::forward<_Ep>(__u.get_deleter());
642 return *this;
643 }
644
645 /// Reset the %unique_ptr to empty, invoking the deleter if necessary.
646 unique_ptr&
647 operator=(nullptr_t) noexcept
648 {
649 reset();
650 return *this;
651 }
652
653 // Observers.
654
655 /// Access an element of owned array.
656 typename std::add_lvalue_reference<element_type>::type
657 operator[](size_t __i) const
658 {
659 __glibcxx_assert(get() != pointer());
660 return get()[__i];
661 }
662
663 /// Return the stored pointer.
664 pointer
665 get() const noexcept
666 { return _M_t._M_ptr(); }
667
668 /// Return a reference to the stored deleter.
669 deleter_type&
670 get_deleter() noexcept
671 { return _M_t._M_deleter(); }
672
673 /// Return a reference to the stored deleter.
674 const deleter_type&
675 get_deleter() const noexcept
676 { return _M_t._M_deleter(); }
677
678 /// Return @c true if the stored pointer is not null.
679 explicit operator bool() const noexcept
680 { return get() == pointer() ? false : true; }
681
682 // Modifiers.
683
684 /// Release ownership of any stored pointer.
685 pointer
686 release() noexcept
687 { return _M_t.release(); }
688
689 /** @brief Replace the stored pointer.
690 *
691 * @param __p The new pointer to store.
692 *
693 * The deleter will be invoked if a pointer is already owned.
694 */
695 template <typename _Up,
696 typename = _Require<
697 __or_<is_same<_Up, pointer>,
698 __and_<is_same<pointer, element_type*>,
699 is_pointer<_Up>,
700 is_convertible<
701 typename remove_pointer<_Up>::type(*)[],
702 element_type(*)[]
703 >
704 >
705 >
706 >>
707 void
708 reset(_Up __p) noexcept
709 { _M_t.reset(std::move(__p)); }
710
711 void reset(nullptr_t = nullptr) noexcept
712 { reset(pointer()); }
713
714 /// Exchange the pointer and deleter with another object.
715 void
716 swap(unique_ptr& __u) noexcept
717 {
718 static_assert(__is_swappable<_Dp>::value, "deleter must be swappable");
719 _M_t.swap(__u._M_t);
720 }
721
722 // Disable copy from lvalue.
723 unique_ptr(const unique_ptr&) = delete;
724 unique_ptr& operator=(const unique_ptr&) = delete;
725 };
726
727 /// @relates unique_ptr @{
728
729 /// Swap overload for unique_ptr
730 template<typename _Tp, typename _Dp>
731 inline
732#if __cplusplus201402L > 201402L || !defined(__STRICT_ANSI__1) // c++1z or gnu++11
733 // Constrained free swap overload, see p0185r1
734 typename enable_if<__is_swappable<_Dp>::value>::type
735#else
736 void
737#endif
738 swap(unique_ptr<_Tp, _Dp>& __x,
739 unique_ptr<_Tp, _Dp>& __y) noexcept
740 { __x.swap(__y); }
741
742#if __cplusplus201402L > 201402L || !defined(__STRICT_ANSI__1) // c++1z or gnu++11
743 template<typename _Tp, typename _Dp>
744 typename enable_if<!__is_swappable<_Dp>::value>::type
745 swap(unique_ptr<_Tp, _Dp>&,
746 unique_ptr<_Tp, _Dp>&) = delete;
747#endif
748
749 /// Equality operator for unique_ptr objects, compares the owned pointers
750 template<typename _Tp, typename _Dp,
751 typename _Up, typename _Ep>
752 _GLIBCXX_NODISCARD inline bool
753 operator==(const unique_ptr<_Tp, _Dp>& __x,
754 const unique_ptr<_Up, _Ep>& __y)
755 { return __x.get() == __y.get(); }
756
757 /// unique_ptr comparison with nullptr
758 template<typename _Tp, typename _Dp>
759 _GLIBCXX_NODISCARD inline bool
760 operator==(const unique_ptr<_Tp, _Dp>& __x, nullptr_t) noexcept
761 { return !__x; }
762
763#ifndef __cpp_lib_three_way_comparison
764 /// unique_ptr comparison with nullptr
765 template<typename _Tp, typename _Dp>
766 _GLIBCXX_NODISCARD inline bool
767 operator==(nullptr_t, const unique_ptr<_Tp, _Dp>& __x) noexcept
768 { return !__x; }
769
770 /// Inequality operator for unique_ptr objects, compares the owned pointers
771 template<typename _Tp, typename _Dp,
772 typename _Up, typename _Ep>
773 _GLIBCXX_NODISCARD inline bool
774 operator!=(const unique_ptr<_Tp, _Dp>& __x,
775 const unique_ptr<_Up, _Ep>& __y)
776 { return __x.get() != __y.get(); }
777
778 /// unique_ptr comparison with nullptr
779 template<typename _Tp, typename _Dp>
780 _GLIBCXX_NODISCARD inline bool
781 operator!=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t) noexcept
782 { return (bool)__x; }
783
784 /// unique_ptr comparison with nullptr
785 template<typename _Tp, typename _Dp>
786 _GLIBCXX_NODISCARD inline bool
787 operator!=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x) noexcept
788 { return (bool)__x; }
789#endif // three way comparison
790
791 /// Relational operator for unique_ptr objects, compares the owned pointers
792 template<typename _Tp, typename _Dp,
793 typename _Up, typename _Ep>
794 _GLIBCXX_NODISCARD inline bool
795 operator<(const unique_ptr<_Tp, _Dp>& __x,
796 const unique_ptr<_Up, _Ep>& __y)
797 {
798 typedef typename
799 std::common_type<typename unique_ptr<_Tp, _Dp>::pointer,
800 typename unique_ptr<_Up, _Ep>::pointer>::type _CT;
801 return std::less<_CT>()(__x.get(), __y.get());
802 }
803
804 /// unique_ptr comparison with nullptr
805 template<typename _Tp, typename _Dp>
806 _GLIBCXX_NODISCARD inline bool
807 operator<(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
808 {
809 return std::less<typename unique_ptr<_Tp, _Dp>::pointer>()(__x.get(),
810 nullptr);
811 }
812
813 /// unique_ptr comparison with nullptr
814 template<typename _Tp, typename _Dp>
815 _GLIBCXX_NODISCARD inline bool
816 operator<(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
817 {
818 return std::less<typename unique_ptr<_Tp, _Dp>::pointer>()(nullptr,
819 __x.get());
820 }
821
822 /// Relational operator for unique_ptr objects, compares the owned pointers
823 template<typename _Tp, typename _Dp,
824 typename _Up, typename _Ep>
825 _GLIBCXX_NODISCARD inline bool
826 operator<=(const unique_ptr<_Tp, _Dp>& __x,
827 const unique_ptr<_Up, _Ep>& __y)
828 { return !(__y < __x); }
829
830 /// unique_ptr comparison with nullptr
831 template<typename _Tp, typename _Dp>
832 _GLIBCXX_NODISCARD inline bool
833 operator<=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
834 { return !(nullptr < __x); }
835
836 /// unique_ptr comparison with nullptr
837 template<typename _Tp, typename _Dp>
838 _GLIBCXX_NODISCARD inline bool
839 operator<=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
840 { return !(__x < nullptr); }
841
842 /// Relational operator for unique_ptr objects, compares the owned pointers
843 template<typename _Tp, typename _Dp,
844 typename _Up, typename _Ep>
845 _GLIBCXX_NODISCARD inline bool
846 operator>(const unique_ptr<_Tp, _Dp>& __x,
847 const unique_ptr<_Up, _Ep>& __y)
848 { return (__y < __x); }
849
850 /// unique_ptr comparison with nullptr
851 template<typename _Tp, typename _Dp>
852 _GLIBCXX_NODISCARD inline bool
853 operator>(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
854 {
855 return std::less<typename unique_ptr<_Tp, _Dp>::pointer>()(nullptr,
856 __x.get());
857 }
858
859 /// unique_ptr comparison with nullptr
860 template<typename _Tp, typename _Dp>
861 _GLIBCXX_NODISCARD inline bool
862 operator>(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
863 {
864 return std::less<typename unique_ptr<_Tp, _Dp>::pointer>()(__x.get(),
865 nullptr);
866 }
867
868 /// Relational operator for unique_ptr objects, compares the owned pointers
869 template<typename _Tp, typename _Dp,
870 typename _Up, typename _Ep>
871 _GLIBCXX_NODISCARD inline bool
872 operator>=(const unique_ptr<_Tp, _Dp>& __x,
873 const unique_ptr<_Up, _Ep>& __y)
874 { return !(__x < __y); }
875
876 /// unique_ptr comparison with nullptr
877 template<typename _Tp, typename _Dp>
878 _GLIBCXX_NODISCARD inline bool
879 operator>=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
880 { return !(__x < nullptr); }
881
882 /// unique_ptr comparison with nullptr
883 template<typename _Tp, typename _Dp>
884 _GLIBCXX_NODISCARD inline bool
885 operator>=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
886 { return !(nullptr < __x); }
887
888#ifdef __cpp_lib_three_way_comparison
889 template<typename _Tp, typename _Dp, typename _Up, typename _Ep>
890 requires three_way_comparable_with<typename unique_ptr<_Tp, _Dp>::pointer,
891 typename unique_ptr<_Up, _Ep>::pointer>
892 inline
893 compare_three_way_result_t<typename unique_ptr<_Tp, _Dp>::pointer,
894 typename unique_ptr<_Up, _Ep>::pointer>
895 operator<=>(const unique_ptr<_Tp, _Dp>& __x,
896 const unique_ptr<_Up, _Ep>& __y)
897 { return compare_three_way()(__x.get(), __y.get()); }
898
899 template<typename _Tp, typename _Dp>
900 requires three_way_comparable<typename unique_ptr<_Tp, _Dp>::pointer>
901 inline
902 compare_three_way_result_t<typename unique_ptr<_Tp, _Dp>::pointer>
903 operator<=>(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
904 {
905 using pointer = typename unique_ptr<_Tp, _Dp>::pointer;
906 return compare_three_way()(__x.get(), static_cast<pointer>(nullptr));
907 }
908#endif
909 // @} relates unique_ptr
910
911 /// @cond undocumented
912 template<typename _Up, typename _Ptr = typename _Up::pointer,
913 bool = __poison_hash<_Ptr>::__enable_hash_call>
914 struct __uniq_ptr_hash
915#if ! _GLIBCXX_INLINE_VERSION0
916 : private __poison_hash<_Ptr>
917#endif
918 {
919 size_t
920 operator()(const _Up& __u) const
921 noexcept(noexcept(std::declval<hash<_Ptr>>()(std::declval<_Ptr>())))
922 { return hash<_Ptr>()(__u.get()); }
923 };
924
925 template<typename _Up, typename _Ptr>
926 struct __uniq_ptr_hash<_Up, _Ptr, false>
927 : private __poison_hash<_Ptr>
928 { };
929 /// @endcond
930
931 /// std::hash specialization for unique_ptr.
932 template<typename _Tp, typename _Dp>
933 struct hash<unique_ptr<_Tp, _Dp>>
934 : public __hash_base<size_t, unique_ptr<_Tp, _Dp>>,
935 public __uniq_ptr_hash<unique_ptr<_Tp, _Dp>>
936 { };
937
938#if __cplusplus201402L >= 201402L
939 /// @relates unique_ptr @{
940#define __cpp_lib_make_unique201304 201304
941
942 /// @cond undocumented
943
944 template<typename _Tp>
945 struct _MakeUniq
946 { typedef unique_ptr<_Tp> __single_object; };
947
948 template<typename _Tp>
949 struct _MakeUniq<_Tp[]>
950 { typedef unique_ptr<_Tp[]> __array; };
951
952 template<typename _Tp, size_t _Bound>
953 struct _MakeUniq<_Tp[_Bound]>
954 { struct __invalid_type { }; };
955
956 /// @endcond
957
958 /// std::make_unique for single objects
959 template<typename _Tp, typename... _Args>
960 inline typename _MakeUniq<_Tp>::__single_object
961 make_unique(_Args&&... __args)
962 { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
21
Memory is allocated
963
964 /// std::make_unique for arrays of unknown bound
965 template<typename _Tp>
966 inline typename _MakeUniq<_Tp>::__array
967 make_unique(size_t __num)
968 { return unique_ptr<_Tp>(new remove_extent_t<_Tp>[__num]()); }
969
970 /// Disable std::make_unique for arrays of known bound
971 template<typename _Tp, typename... _Args>
972 inline typename _MakeUniq<_Tp>::__invalid_type
973 make_unique(_Args&&...) = delete;
974 // @} relates unique_ptr
975#endif // C++14
976
977#if __cplusplus201402L > 201703L && __cpp_concepts
978 // _GLIBCXX_RESOLVE_LIB_DEFECTS
979 // 2948. unique_ptr does not define operator<< for stream output
980 /// Stream output operator for unique_ptr
981 template<typename _CharT, typename _Traits, typename _Tp, typename _Dp>
982 inline basic_ostream<_CharT, _Traits>&
983 operator<<(basic_ostream<_CharT, _Traits>& __os,
984 const unique_ptr<_Tp, _Dp>& __p)
985 requires requires { __os << __p.get(); }
986 {
987 __os << __p.get();
988 return __os;
989 }
990#endif // C++20
991
992 // @} group pointer_abstractions
993
994#if __cplusplus201402L >= 201703L
995 namespace __detail::__variant
996 {
997 template<typename> struct _Never_valueless_alt; // see <variant>
998
999 // Provide the strong exception-safety guarantee when emplacing a
1000 // unique_ptr into a variant.
1001 template<typename _Tp, typename _Del>
1002 struct _Never_valueless_alt<std::unique_ptr<_Tp, _Del>>
1003 : std::true_type
1004 { };
1005 } // namespace __detail::__variant
1006#endif // C++17
1007
1008_GLIBCXX_END_NAMESPACE_VERSION
1009} // namespace
1010
1011#endif /* _UNIQUE_PTR_H */