diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -62,6 +62,10 @@ already properly diagnosing this case). - Fix clang not properly diagnosing the failing subexpression when chained binary operators are used in a ``static_assert`` expression. +- Fix a crash when evaluating a multi-dimensional array's array filler + expression is element-dependent. This fixes + `Issue 50601 `_. + Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 @@ -10695,6 +10695,11 @@ if (MaybeElementDependentArrayFiller(ILE->getInit(I))) return true; } + + if (ILE->hasArrayFiller() && + MaybeElementDependentArrayFiller(ILE->getArrayFiller())) + return true; + return false; } return true; diff --git a/clang/test/SemaCXX/constexpr-array-init.cpp b/clang/test/SemaCXX/constexpr-array-init.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/constexpr-array-init.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -std=c++20 -verify %s + +/// This test case used to crash in constant evaluation +/// because of the two-dimensional array with an array +/// filler expression. + +/// expected-no-diagnostics +struct Foo { + int a; + constexpr Foo() + : a(get_int()) { + } + + constexpr int get_int() const { + return 5; + } +}; + +static constexpr Foo bar[2][1] = { + {{}}, +}; +static_assert(bar[0][0].a == 5); +static_assert(bar[1][0].a == 5); +