--- /dev/null
+// PR c++/69023 - bitset whose name is used in constant-expression rejected
+// Test also verifies the correct evaluation of the expressions with
+// -fpermissive.
+// { dg-options "-fpermissive" }
+
+#if __cplusplus >= 201103L
+# define ASSERT(e) static_assert (e, #e)
+#else
+# define ASSERT(e) \
+ do { struct S { bool: !!(e); } asrt; (void)&asrt; } while (0)
+#endif
+
+
+void test_bitset ()
+{
+ int x; // { dg-warning "changes meaning" }
+
+ {
+ struct S {
+ int x: sizeof x; // { dg-warning "declaration" }
+ };
+ }
+}
+
+void test_enum ()
+{
+ // Also exercise (not covered by c++/69023):
+ int y; // { dg-warning "changes meaning" }
+ {
+ struct S {
+ enum E {
+ y = sizeof y // { dg-warning "declaration" }
+ };
+
+ // Verify the enumerator has the correct value.
+ void test () { ASSERT (y == sizeof (int)); }
+ };
+ }
+}
+
+void test_alignas ()
+{
+ enum { A = 16 }; // { dg-warning "changes meaning" }
+ {
+ struct S {
+#if __cplusplus >= 201103L
+ alignas (A)
+#else
+ __attribute__ ((aligned (A)))
+#endif
+ int A; // { dg-warning "declaration" }
+
+ // Verify the member has the correct alignment.
+ void test () { ASSERT (__alignof__ (this->A) == 16); }
+ };
+ }
+}
+
+void test_array ()
+{
+ enum { A = 16 }; // { dg-warning "changes meaning" }
+ {
+ struct S {
+ int A [A]; // { dg-warning "declaration" }
+
+ // Verify the member has the correct alignment.
+ void test () { ASSERT (sizeof (this->A) == 16 * sizeof (int)); }
+ };
+ }
+}
+
+void test_vector ()
+{
+ enum { A = 16 }; // { dg-warning "changes meaning" }
+ {
+ struct S {
+ int A __attribute__ ((vector_size (A))); // { dg-warning "declaration" }
+
+ // Verify the member has the correct size.
+ void test () { ASSERT (sizeof (this->A) == 16); }
+ };
+ }
+}
+