https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92238
Bug ID: 92238 Summary: constexpr fails to compile 2d std::array in C++ 10 master Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: euloanty at live dot com Target Milestone: --- Created attachment 47118 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47118&action=edit The bugged code I tried the same code with gcc 9.2, clang, visual C++. They all work. However, the code fails to compile on gcc master. It gives me the error message of "error: modifying a const object". Current directory: D:\git\f3\fast_io\examples\0026.helper g++ -o gennum gennum.cc -O3 -std=c++2a -fconcepts -Wall -Wextra -ltbb -DNDEBUG Process started (PID=14596) >>> gennum.cc: In function 'int main()': gennum.cc:67:40: in 'constexpr' expansion of 'cal_content<2, false>()' gennum.cc:67:41: error: modifying a const object 'vals.std::array<std::array<char, 8>, 256>::_M_elems[1].std::array<char, 8>::_M_elems[7]' is not allowed in a constant expression 67 | constexpr auto a(cal_content<2,false>()); | ^ gennum.cc:67:41: note: originally declared 'const' here gennum.cc:71:19: warning: unused variable 'e' [-Wunused-variable] 71 | for(auto const & e : a) | ^ <<< Process finished (PID=14596). (Exit code 1) ================ READY =============== You can check that on Godbolt for different compilers https://godbolt.org/z/4V4qVk I think it is because the changes made by Marek Polacek which breaks the code. It incorrectly detects constructs of objects in constexpr (because of copy elision rule???) 2019-08-19 Marek Polacek <pola...@redhat.com> PR c++/91264 - detect modifying const objects in constexpr. * constexpr.c (modifying_const_object_error): New function. (cxx_eval_call_expression): Set TREE_READONLY on a CONSTRUCTOR of a const-qualified object after it's been fully constructed. (modifying_const_object_p): New function. (cxx_eval_store_expression): Detect modifying a const object during constant expression evaluation. (cxx_eval_increment_expression): Use a better location when building up the store. (cxx_eval_constant_expression) <case DECL_EXPR>: Mark a constant object's constructor TREE_READONLY.