diff --git a/flang/include/flang/Common/idioms.h b/flang/include/flang/Common/idioms.h --- a/flang/include/flang/Common/idioms.h +++ b/flang/include/flang/Common/idioms.h @@ -26,6 +26,7 @@ #include "llvm/Support/Compiler.h" #include #include +#include #include #include #include @@ -142,6 +143,14 @@ return *p; } +template +constexpr T &Deref(const std::unique_ptr &p, const char *file, int line) { + if (!p) { + Fortran::common::die("nullptr dereference at %s(%d)", file, line); + } + return *p; +} + // Given a const reference to a value, return a copy of the value. template A Clone(const A &x) { return x; } diff --git a/flang/include/flang/Evaluate/intrinsics.h b/flang/include/flang/Evaluate/intrinsics.h --- a/flang/include/flang/Evaluate/intrinsics.h +++ b/flang/include/flang/Evaluate/intrinsics.h @@ -15,6 +15,7 @@ #include "flang/Common/default-kinds.h" #include "flang/Parser/char-block.h" #include "flang/Parser/message.h" +#include #include #include @@ -64,8 +65,12 @@ private: class Implementation; + IntrinsicProcTable() = default; + public: ~IntrinsicProcTable(); + IntrinsicProcTable(IntrinsicProcTable &&) = default; + static IntrinsicProcTable Configure( const common::IntrinsicTypeDefaultKinds &); @@ -100,7 +105,7 @@ llvm::raw_ostream &Dump(llvm::raw_ostream &) const; private: - Implementation *impl_{nullptr}; // owning pointer + std::unique_ptr impl_; }; // Check if an intrinsic explicitly allows its INTENT(OUT) arguments to be diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -2221,16 +2221,12 @@ return DynamicType{category, defaults_.GetDefaultKind(category)}; } -IntrinsicProcTable::~IntrinsicProcTable() { - // Discard the configured tables. - delete impl_; - impl_ = nullptr; -} +IntrinsicProcTable::~IntrinsicProcTable() = default; IntrinsicProcTable IntrinsicProcTable::Configure( const common::IntrinsicTypeDefaultKinds &defaults) { IntrinsicProcTable result; - result.impl_ = new IntrinsicProcTable::Implementation(defaults); + result.impl_ = std::make_unique(defaults); return result; }