Make ManagedStatic constexpr constructible

Apparently it needs member initializers so that it can be constructed in
a constexpr context. I explained my investigation of this in PR41367.

llvm-svn: 357655
This commit is contained in:
Reid Kleckner 2019-04-04 00:11:21 +00:00
parent 920f6c8163
commit e9f2847b81

View File

@ -37,13 +37,18 @@ class ManagedStaticBase {
protected:
// This should only be used as a static variable, which guarantees that this
// will be zero initialized.
mutable std::atomic<void *> Ptr;
mutable void (*DeleterFn)(void*);
mutable const ManagedStaticBase *Next;
mutable std::atomic<void *> Ptr{nullptr};
mutable void (*DeleterFn)(void *) = nullptr;
mutable const ManagedStaticBase *Next = nullptr;
void RegisterManagedStatic(void *(*creator)(), void (*deleter)(void*)) const;
public:
/// ManagedStaticBase must be constexpr constructed so that they can be
/// accessed and constructed lazily during dynamic initilization of other
/// global variables, such as cl::opt command line flags.
constexpr ManagedStaticBase() = default;
/// isConstructed - Return true if this object has not been created yet.
bool isConstructed() const { return Ptr != nullptr; }