Clang rejects this testcase saying that the VLA is a non-literal type, but I think we don't want that; we want to allow VLAs in a constexpr function, where the length can be constant during constexpr evaluation.
In this case, however, we are dealing with a constexpr variable rather than a variable in a constexpr function, so we want to reject the VLA. Tested x86_64-pc-linux-gnu, applying to trunk.
commit d63c30c86d45831f20c4dc35f4ffaac2cfdd2588 Author: Jason Merrill <ja...@redhat.com> Date: Mon Feb 26 15:32:32 2018 -0500 PR c++/84559 - ICE with constexpr VLA. * constexpr.c (ensure_literal_type_for_constexpr_object): Check for constexpr variable with VLA type. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 26d0d099a05..92b13219215 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -112,6 +112,13 @@ ensure_literal_type_for_constexpr_object (tree decl) cp_function_chain->invalid_constexpr = true; } } + else if (DECL_DECLARED_CONSTEXPR_P (decl) + && variably_modified_type_p (type, NULL_TREE)) + { + error ("%<constexpr%> variable %qD has variably-modified type %qT", + decl, type); + decl = error_mark_node; + } } return decl; } diff --git a/gcc/testsuite/g++.dg/ext/constexpr-vla5.C b/gcc/testsuite/g++.dg/ext/constexpr-vla5.C new file mode 100644 index 00000000000..565d40ab077 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/constexpr-vla5.C @@ -0,0 +1,7 @@ +// PR c++/84559 +// { dg-do compile { target c++11 } } + +void foo(int i) +{ + constexpr char x[i] = ""; // { dg-error "" } +}