// PR c++/91360 - Implement C++20 P1143R2: constinit // { dg-do compile { target c++20 } } // Test basic usage of 'constinit'. const char *g() { return "dynamic init"; } constexpr const char *f(bool p) { return p ? "constant init" : g(); } // { dg-error "call to non-.constexpr. function" } constinit const char *c = f(true); constinit const char *d = f(false); // { dg-error "variable .d. does not have a constant initializer" } // { dg-message "in .constexpr. expansion of" "" { target *-*-* } .-1 } static constinit const char *e = f(true); constexpr int foo(int x) { return x; } constinit int i = foo(42); constinit int j // { dg-error "variable .j. does not have a constant initializer" } = foo(i); // { dg-error "not usable in a constant expression" } int y = 42; constinit int x // { dg-error "variable .x. does not have a constant initializer" } = y; // { dg-error "not usable in a constant expression" } constinit int z; const constinit unsigned cst = 1u; void fn () { static constinit int m = foo(42); static constinit int n // { dg-error "variable .n. does not have a constant initializer" } = foo(m); // { dg-error "not usable in a constant expression" } // Make sure we can still modify constinit variables. c = "foo"; i = 10; m = 90; // ... unless they're 'const'. cst *= 2; // { dg-error "assignment of read-only variable" } }