summaryrefslogtreecommitdiff
path: root/src/mongo/base/status.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/base/status.h')
-rw-r--r--src/mongo/base/status.h18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/mongo/base/status.h b/src/mongo/base/status.h
index 0b9d1fc1f6e..4d6e332f28a 100644
--- a/src/mongo/base/status.h
+++ b/src/mongo/base/status.h
@@ -168,27 +168,31 @@ public:
/**
* Returns the generic ErrorExtraInfo if present.
*/
- const ErrorExtraInfo* extraInfo() const {
- return isOK() ? nullptr : _error->extra.get();
+ const std::shared_ptr<const ErrorExtraInfo> extraInfo() const {
+ return isOK() ? nullptr : _error->extra;
}
/**
* Returns a specific subclass of ErrorExtraInfo if the error code matches that type.
*/
template <typename T>
- const T* extraInfo() const {
+ std::shared_ptr<const T> extraInfo() const {
MONGO_STATIC_ASSERT(std::is_base_of<ErrorExtraInfo, T>());
MONGO_STATIC_ASSERT(std::is_same<error_details::ErrorExtraInfoFor<T::code>, T>());
if (isOK())
- return nullptr;
+ return {};
if (code() != T::code)
- return nullptr;
+ return {};
+
+ if (!_error->extra) {
+ invariant(!ErrorCodes::mustHaveExtraInfo(_error->code));
+ return {};
+ }
// Can't use checked_cast due to include cycle.
- invariant(_error->extra);
dassert(dynamic_cast<const T*>(_error->extra.get()));
- return static_cast<const T*>(_error->extra.get());
+ return std::static_pointer_cast<const T>(_error->extra);
}
std::string toString() const;