Index: clang/lib/AST/Interp/Interp.h =================================================================== --- clang/lib/AST/Interp/Interp.h +++ clang/lib/AST/Interp/Interp.h @@ -949,7 +949,12 @@ const Pointer &Ptr = S.Stk.peek(); if (!CheckLoad(S, OpPC, Ptr)) return false; - S.Stk.push(Ptr.deref()); + // When getting the first value of an array, we need to offset to the + // first element. + if (Ptr.inArray() && Ptr.isRoot()) + S.Stk.push(Ptr.atIndex(0).deref()); + else + S.Stk.push(Ptr.deref()); return true; } @@ -958,7 +963,12 @@ const Pointer &Ptr = S.Stk.pop(); if (!CheckLoad(S, OpPC, Ptr)) return false; - S.Stk.push(Ptr.deref()); + // When getting the first value of an array, we need to offset to the + // first element. + if (Ptr.inArray() && Ptr.isRoot()) + S.Stk.push(Ptr.atIndex(0).deref()); + else + S.Stk.push(Ptr.deref()); return true; } Index: clang/test/AST/Interp/arrays.cpp =================================================================== --- clang/test/AST/Interp/arrays.cpp +++ clang/test/AST/Interp/arrays.cpp @@ -42,6 +42,12 @@ return *(Arr + index); } +constexpr int derefPtr(const int *d) { + return *d; +} +static_assert(derefPtr(data) == 5, ""); + + static_assert(getElement(data, 1) == 4, ""); static_assert(getElement(data, 4) == 1, "");