summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/warn-global-constructors.cpp
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2017-10-24 02:17:07 +0000
committerJordan Rose <jordan_rose@apple.com>2017-10-24 02:17:07 +0000
commitd4503da40c65451ac4a2ab6572bbd3216d0e756e (patch)
tree42799aa257e5fac01baca49aa9c75d7b7c3d3dbc /clang/test/SemaCXX/warn-global-constructors.cpp
parentbd83ad4a87680f5f93607e1402cda3e2a4bd647b (diff)
downloadbcm5719-llvm-d4503da40c65451ac4a2ab6572bbd3216d0e756e.tar.gz
bcm5719-llvm-d4503da40c65451ac4a2ab6572bbd3216d0e756e.zip
Unnamed bitfields don't block constant evaluation of constexpr ctors
C++14 [dcl.constexpr]p4 states that in the body of a constexpr constructor, > every non-variant non-static data member and base class sub-object shall be initialized However, [class.bit]p2 notes that > Unnamed bit-fields are not members and cannot be initialized. Therefore, we should make sure to filter them out of the check that all fields are initialized. Fixing this makes the constant evaluator a bit smarter, and specifically allows constexpr constructors to avoid tripping -Wglobal-constructors when the type contains unnamed bitfields. Reviewed at https://reviews.llvm.org/D39035. llvm-svn: 316408
Diffstat (limited to 'clang/test/SemaCXX/warn-global-constructors.cpp')
-rw-r--r--clang/test/SemaCXX/warn-global-constructors.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/warn-global-constructors.cpp b/clang/test/SemaCXX/warn-global-constructors.cpp
index 856826414a8..430f239a3ed 100644
--- a/clang/test/SemaCXX/warn-global-constructors.cpp
+++ b/clang/test/SemaCXX/warn-global-constructors.cpp
@@ -126,3 +126,22 @@ namespace pr20420 {
void *array_storage[1];
const int &global_reference = *(int *)array_storage;
}
+
+namespace bitfields {
+ struct HasUnnamedBitfield {
+ unsigned a;
+ unsigned : 20;
+ unsigned b;
+
+ constexpr HasUnnamedBitfield() : a(), b() {}
+ constexpr HasUnnamedBitfield(unsigned a, unsigned b) : a(a), b(b) {}
+ explicit HasUnnamedBitfield(unsigned a) {}
+ };
+
+ const HasUnnamedBitfield zeroConst{};
+ HasUnnamedBitfield zeroMutable{};
+ const HasUnnamedBitfield explicitConst{1, 2};
+ HasUnnamedBitfield explicitMutable{1, 2};
+ const HasUnnamedBitfield nonConstexprConst{1}; // expected-warning {{global constructor}}
+ HasUnnamedBitfield nonConstexprMutable{1}; // expected-warning {{global constructor}}
+}
OpenPOWER on IntegriCloud