diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -10917,7 +10917,7 @@ for (unsigned I = OldElts; I < N; ++I) Value->getArrayInitializedElt(I) = Filler; - if (HasTrivialConstructor && N == FinalSize) { + if (HasTrivialConstructor && N == FinalSize && FinalSize != 1) { // If we have a trivial constructor, only evaluate it once and copy // the result into all the array elements. APValue &FirstResult = Value->getArrayInitializedElt(0); diff --git a/clang/test/SemaCXX/constexpr-single-element-array.cpp b/clang/test/SemaCXX/constexpr-single-element-array.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/constexpr-single-element-array.cpp @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -std=c++20 -verify %s + +// This test makes sure that a single element array doesn't produce +// spurious errors during constexpr evaluation. + +// expected-no-diagnostics +struct Sub { int x; }; + +struct S { + constexpr S() { Arr[0] = Sub{}; } + Sub Arr[1]; +}; + +constexpr bool test() { + S s; + return true; +} + +static_assert(test());