diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-08-06 07:09:20 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-08-06 07:09:20 +0000 |
| commit | 49ca8aab584c12dc1020582377484671bb9722f7 (patch) | |
| tree | da5b348911fdff84a4d260fa558079b9b63ca5c4 /clang/test/SemaCXX/constant-expression-cxx11.cpp | |
| parent | 7418ff460c6bbdb5e861ee0a0eedb039156e9bd4 (diff) | |
| download | bcm5719-llvm-49ca8aab584c12dc1020582377484671bb9722f7.tar.gz bcm5719-llvm-49ca8aab584c12dc1020582377484671bb9722f7.zip | |
PR16755: When initializing or modifying a bitfield member in a constant
expression, truncate the stored value to the size of the bitfield.
llvm-svn: 187782
Diffstat (limited to 'clang/test/SemaCXX/constant-expression-cxx11.cpp')
| -rw-r--r-- | clang/test/SemaCXX/constant-expression-cxx11.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index 8d16962387e..6824909db89 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -1727,3 +1727,40 @@ namespace Lifetime { constexpr int k1 = S().t; // ok, int is lifetime-extended to end of constructor constexpr int k2 = S(0).t; // expected-error {{constant expression}} expected-note {{in call}} } + +namespace Bitfields { + struct A { + bool b : 1; + unsigned u : 5; + int n : 5; + bool b2 : 3; + unsigned u2 : 74; // expected-warning {{exceeds the size of its type}} + int n2 : 81; // expected-warning {{exceeds the size of its type}} + }; + + constexpr A a = { false, 33, 31, false, 0xffffffff, 0x7fffffff }; // expected-warning 2{{truncation}} + static_assert(a.b == 0 && a.u == 1 && a.n == -1 && a.b2 == 0 && + a.u2 + 1 == 0 && a.n2 == 0x7fffffff, + "bad truncation of bitfield values"); + + struct B { + int n : 3; + constexpr B(int k) : n(k) {} + }; + static_assert(B(3).n == 3, ""); + static_assert(B(4).n == -4, ""); + static_assert(B(7).n == -1, ""); + static_assert(B(8).n == 0, ""); + static_assert(B(-1).n == -1, ""); + static_assert(B(-8889).n == -1, ""); + + namespace PR16755 { + struct X { + int x : 1; + constexpr static int f(int x) { + return X{x}.x; + } + }; + static_assert(X::f(3) == -1, "3 should truncate to -1"); + } +} |

