-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add warning when assigning enums to bitfields without an explicit uns…
…igned underlying type Summary: Add a warning when assigning enums to bitfields without an explicit unsigned underlying type. This is to prevent problems with MSVC compatibility, since the Microsoft ABI defaults to storing enums with a signed type, causing inconsistencies with saving to/reading from bitfields. Also disabled the warning in the dr0xx.cpp test which throws the error, and added a test for the warning. The warning can be disabled with -Wno-signed-enum-bitfield. Patch by Sasha Bermeister! Reviewers: rnk, aaron.ballman Subscribers: mehdi_amini, aaron.ballman, cfe-commits, thakis, dcheng Differential Revision: https://reviews.llvm.org/D24289 llvm-svn: 287177
- Loading branch information
Showing
4 changed files
with
65 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
// RUN: %clang_cc1 -fsyntax-only -Wsigned-enum-bitfield -verify %s --std=c++11 | ||
|
||
// Enums used in bitfields with no explicitly specified underlying type. | ||
void test0() { | ||
enum E { E1, E2 }; | ||
enum F { F1, F2 }; | ||
struct { E e1 : 1; E e2; F f1 : 1; F f2; } s; | ||
|
||
s.e1 = E1; // expected-warning {{enums in the Microsoft ABI are signed integers by default; consider giving the enum E an unsigned underlying type to make this code portable}} | ||
s.f1 = F1; // expected-warning {{enums in the Microsoft ABI are signed integers by default; consider giving the enum F an unsigned underlying type to make this code portable}} | ||
|
||
s.e2 = E2; | ||
s.f2 = F2; | ||
} | ||
|
||
// Enums used in bitfields with an explicit signed underlying type. | ||
void test1() { | ||
enum E : signed { E1, E2 }; | ||
enum F : long { F1, F2 }; | ||
struct { E e1 : 1; E e2; F f1 : 1; F f2; } s; | ||
|
||
s.e1 = E1; | ||
s.f1 = F1; | ||
|
||
s.e2 = E2; | ||
s.f2 = F2; | ||
} | ||
|
||
// Enums used in bitfields with an explicitly unsigned underlying type. | ||
void test3() { | ||
enum E : unsigned { E1, E2 }; | ||
enum F : unsigned long { F1, F2 }; | ||
struct { E e1 : 1; E e2; F f1 : 1; F f2; } s; | ||
|
||
s.e1 = E1; | ||
s.f1 = F1; | ||
|
||
s.e2 = E2; | ||
s.f2 = F2; | ||
} |