In C++14 onwards, it is permitted to read mutable members in constant
expressions, if their lifetime began during the evaluation of the expression.
This is technically not allowed in C++11, though we could consider permitting
it there too, as an extension.
llvm-svn: 325663
diff --git a/clang/test/SemaCXX/constant-expression-cxx1y.cpp b/clang/test/SemaCXX/constant-expression-cxx1y.cpp
index 12fec08..f81988c 100644
--- a/clang/test/SemaCXX/constant-expression-cxx1y.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx1y.cpp
@@ -1021,3 +1021,26 @@
}
static_assert(evalNested(), "");
} // namespace PR19741
+
+namespace Mutable {
+ struct A { mutable int n; }; // expected-note 2{{here}}
+ constexpr int k = A{123}.n; // ok
+ static_assert(k == 123, "");
+
+ struct Q { A &&a; int b = a.n; };
+ constexpr Q q = { A{456} }; // ok
+ static_assert(q.b == 456, "");
+
+ constexpr A a = {123};
+ constexpr int m = a.n; // expected-error {{constant expression}} expected-note {{mutable}}
+
+ constexpr Q r = { static_cast<A&&>(const_cast<A&>(a)) }; // expected-error {{constant expression}} expected-note@-7 {{mutable}}
+
+ struct B {
+ mutable int n; // expected-note {{here}}
+ int m;
+ constexpr B() : n(1), m(n) {} // ok
+ };
+ constexpr B b;
+ constexpr int p = b.n; // expected-error {{constant expression}} expected-note {{mutable}}
+}