(adapted from https://stackoverflow.com/q/68517921/1918193) #ifdef WORK #include <array> typedef std::array<char,16> vec; #else typedef char vec __attribute__((vector_size(16))); #endif constexpr auto gen () { vec ret{}; for (int i = 0; i < sizeof(vec); ++i) { ret[i] = 2; } return ret; }; constexpr auto m = gen(); c.cc:9:23: in 'constexpr' expansion of 'gen()' c.cc:9:24: error: modification of '(char [16])ret' is not a constant expression 9 | constexpr auto m = gen(); | ^ However, with -DWORK to use std::array instead of the vector extension, it compiles just fine, so there shouldn't be any strong obstacle to implement this.
Confirmed. I really doubt any of the vector extensions are really supported with constexpr.
So it is any vector array that matters: #ifdef WORK #include <array> typedef std::array<char,2> vec; #else typedef char vec __attribute__((vector_size(2))); #endif constexpr auto gen () { vec ret{1,2}; vec ret1{1,2}; for (int i = 0; i < sizeof(vec); ++i) { ret[i] = ret1[0]; } // ret1[0] =3; // ret1[0] =ret[0]; return ret1; }; auto m = gen(); Note clang rejects the above for non -DWORK case.
(In reply to Andrew Pinski from comment #2) Here is clang's error message which is 10000% wrong. <source>:7:16: error: constexpr function never produces a constant expression [-Winvalid-constexpr] constexpr auto gen () { ^ <source>:11:18: note: subexpression not valid in a constant expression ret[i] = ret1[0]; ^ 1 error generated. Compiler returned: 1