diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index 84f65a33bef36..3d49f73a56762 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -1448,6 +1448,8 @@ template ::T> bool InitElem(InterpState &S, CodePtr OpPC, uint32_t Idx) { const T &Value = S.Stk.pop(); const Pointer &Ptr = S.Stk.peek().atIndex(Idx); + if (Ptr.isUnknownSizeArray()) + return false; if (!CheckInit(S, OpPC, Ptr)) return false; Ptr.initialize(); @@ -1460,6 +1462,8 @@ template ::T> bool InitElemPop(InterpState &S, CodePtr OpPC, uint32_t Idx) { const T &Value = S.Stk.pop(); const Pointer &Ptr = S.Stk.pop().atIndex(Idx); + if (Ptr.isUnknownSizeArray()) + return false; if (!CheckInit(S, OpPC, Ptr)) return false; Ptr.initialize(); diff --git a/clang/test/AST/Interp/arrays.cpp b/clang/test/AST/Interp/arrays.cpp index 2bf6e9ef35119..4b112d7fdddfd 100644 --- a/clang/test/AST/Interp/arrays.cpp +++ b/clang/test/AST/Interp/arrays.cpp @@ -138,6 +138,8 @@ constexpr int dependent[4] = { static_assert(dependent[2] == dependent[0], ""); static_assert(dependent[3] == dependent[1], ""); +union { char x[]; } r = {0}; + #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wc99-extensions" #pragma clang diagnostic ignored "-Winitializer-overrides"