From: Martin Sebor Date: Wed, 23 Dec 2015 21:52:50 +0000 (+0000) Subject: PR c++/69023 - bitset whose name is used in constant-expression rejected X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7c332a4ee508059a09fa63fdcf755dcad6ccbd50;p=gcc.git PR c++/69023 - bitset whose name is used in constant-expression rejected PR c++/69023 - bitset whose name is used in constant-expression rejected * g++.dg/lookup/name-clash11.C: New test. From-SVN: r231938 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ab9fab5a75..2002f929631 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-23 Martin Sebor + + PR c++/69023 + * g++.dg/lookup/name-clash11.C: New test. + 2015-12-23 Nathan Sidwell * gcc.dg/alias-15.c: Revert. diff --git a/gcc/testsuite/g++.dg/lookup/name-clash11.C b/gcc/testsuite/g++.dg/lookup/name-clash11.C new file mode 100644 index 00000000000..28ce4c937c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/name-clash11.C @@ -0,0 +1,84 @@ +// 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); } + }; + } +} +