diff --git a/clang/lib/AST/Interp/Pointer.cpp b/clang/lib/AST/Interp/Pointer.cpp index ff4da0fa805dcf..b22b4b1918ba51 100644 --- a/clang/lib/AST/Interp/Pointer.cpp +++ b/clang/lib/AST/Interp/Pointer.cpp @@ -227,6 +227,12 @@ bool Pointer::isInitialized() const { if (isIntegralPointer()) return true; + if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) { + const GlobalInlineDescriptor &GD = + *reinterpret_cast(block()->rawData()); + return GD.InitState == GlobalInitState::Initialized; + } + assert(PointeeStorage.BS.Pointee && "Cannot check if null pointer was initialized"); const Descriptor *Desc = getFieldDesc(); @@ -249,12 +255,6 @@ bool Pointer::isInitialized() const { if (asBlockPointer().Base == 0) return true; - if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) { - const GlobalInlineDescriptor &GD = - *reinterpret_cast(block()->rawData()); - return GD.InitState == GlobalInitState::Initialized; - } - // Field has its bit in an inline descriptor. return getInlineDesc()->IsInitialized; } @@ -266,6 +266,13 @@ void Pointer::initialize() const { assert(PointeeStorage.BS.Pointee && "Cannot initialize null pointer"); const Descriptor *Desc = getFieldDesc(); + if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) { + GlobalInlineDescriptor &GD = *reinterpret_cast( + asBlockPointer().Pointee->rawData()); + GD.InitState = GlobalInitState::Initialized; + return; + } + assert(Desc); if (Desc->isPrimitiveArray()) { // Primitive global arrays don't have an initmap. @@ -294,13 +301,6 @@ void Pointer::initialize() const { return; } - if (isRoot() && PointeeStorage.BS.Base == sizeof(GlobalInlineDescriptor)) { - GlobalInlineDescriptor &GD = *reinterpret_cast( - asBlockPointer().Pointee->rawData()); - GD.InitState = GlobalInitState::Initialized; - return; - } - // Field has its bit in an inline descriptor. assert(PointeeStorage.BS.Base != 0 && "Only composite fields can be initialised");