Skip to content

Commit 0cd5127

Browse files
committed
Redoing diagnostics to make this an error by default
1 parent 163fd02 commit 0cd5127

File tree

5 files changed

+117
-88
lines changed

5 files changed

+117
-88
lines changed

clang/include/clang/Basic/DiagnosticGroups.td

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ def SingleBitBitFieldConstantConversion :
4949
DiagGroup<"single-bit-bitfield-constant-conversion">;
5050
def BitFieldConstantConversion : DiagGroup<"bitfield-constant-conversion",
5151
[SingleBitBitFieldConstantConversion]>;
52+
def PreferredTypeBitFieldEnumConversion : DiagGroup<"preferred-type-bitfield-enum-conversion">;
53+
def PreferredTypeBitFieldWidth : DiagGroup<"preferred-type-bitfield-width">;
5254
def BitFieldEnumConversion : DiagGroup<"bitfield-enum-conversion">;
5355
def BitFieldWidth : DiagGroup<"bitfield-width">;
5456
def CompoundTokenSplitByMacro : DiagGroup<"compound-token-split-by-macro">;
@@ -1114,7 +1116,9 @@ def Most : DiagGroup<"most", [
11141116
PrivateExtern,
11151117
SelTypeCast,
11161118
ExternCCompat,
1117-
UserDefinedWarnings
1119+
UserDefinedWarnings,
1120+
PreferredTypeBitFieldEnumConversion,
1121+
PreferredTypeBitFieldWidth
11181122
]>;
11191123

11201124
// Thread Safety warnings

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6423,24 +6423,34 @@ def warn_bitfield_width_exceeds_type_width: Warning<
64236423
def err_bitfield_too_wide : Error<
64246424
"%select{bit-field %1|anonymous bit-field}0 is too wide (%2 bits)">;
64256425
def warn_bitfield_too_small_for_enum : Warning<
6426-
"bit-field %0 is not wide enough to store all enumerators of %select{|preferred type }1%2">,
6426+
"bit-field %0 is not wide enough to store all enumerators of %1">,
64276427
InGroup<BitFieldEnumConversion>, DefaultIgnore;
64286428
def note_widen_bitfield : Note<
64296429
"widen this field to %0 bits to store all values of %1">;
64306430
def warn_unsigned_bitfield_assigned_signed_enum : Warning<
6431-
"assigning value of %select{|preferred }1signed enum type %2 to unsigned bit-field %0; "
6431+
"assigning value of signed enum type %1 to unsigned bit-field %0; "
64326432
"negative enumerators of enum %1 will be converted to positive values">,
64336433
InGroup<BitFieldEnumConversion>, DefaultIgnore;
64346434
def warn_signed_bitfield_enum_conversion : Warning<
64356435
"signed bit-field %0 needs an extra bit to represent the largest positive "
6436-
"enumerators of %select{|preferred type }1%2">,
6436+
"enumerators of %1">,
64376437
InGroup<BitFieldEnumConversion>, DefaultIgnore;
6438+
def warn_preferred_type_bitfield_too_small_for_enum : Warning<
6439+
"bit-field %0 is not wide enough to store all enumerators of preferred type %1">,
6440+
InGroup<PreferredTypeBitFieldEnumConversion>, DefaultError;
6441+
def warn_preferred_type_unsigned_bitfield_assigned_signed_enum : Warning<
6442+
"assigning value of preferred signed enum type %1 to unsigned bit-field %0; "
6443+
"negative enumerators of enum %1 will be converted to positive values">,
6444+
InGroup<PreferredTypeBitFieldEnumConversion>, DefaultIgnore;
6445+
def warn_preferred_type_signed_bitfield_enum_conversion : Warning<
6446+
"signed bit-field %0 needs an extra bit to represent the largest positive "
6447+
"enumerators of preferred type %1">,
6448+
InGroup<PreferredTypeBitFieldEnumConversion>, DefaultError;
64386449
def note_change_bitfield_sign : Note<
64396450
"consider making the bit-field type %select{unsigned|signed}0">;
64406451
def note_bitfield_preferred_type : Note<
6441-
"preferred type for bitfield %0 specified here"
6452+
"preferred type for bit-field %0 specified here"
64426453
>;
6443-
"consider making the bit-field type %select{unsigned|signed}0">;
64446454

64456455
def warn_missing_braces : Warning<
64466456
"suggest braces around initialization of subobject">,

clang/lib/Sema/SemaChecking.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10608,14 +10608,20 @@ static bool AnalyzeBitFieldAssignment(Sema &S, FieldDecl *Bitfield, Expr *Init,
1060810608
// on Windows where unfixed enums always use an underlying type of 'int'.
1060910609
unsigned DiagID = 0;
1061010610
if (SignedEnum && !SignedBitfield) {
10611-
DiagID = diag::warn_unsigned_bitfield_assigned_signed_enum;
10611+
DiagID =
10612+
PTAttr == nullptr
10613+
? diag::warn_unsigned_bitfield_assigned_signed_enum
10614+
: diag::
10615+
warn_preferred_type_unsigned_bitfield_assigned_signed_enum;
1061210616
} else if (SignedBitfield && !SignedEnum &&
1061310617
ED->getNumPositiveBits() == FieldWidth) {
10614-
DiagID = diag::warn_signed_bitfield_enum_conversion;
10618+
DiagID =
10619+
PTAttr == nullptr
10620+
? diag::warn_signed_bitfield_enum_conversion
10621+
: diag::warn_preferred_type_signed_bitfield_enum_conversion;
1061510622
}
10616-
unsigned PreferredTypeDiagIndex = PTAttr != nullptr;
1061710623
if (DiagID) {
10618-
S.Diag(InitLoc, DiagID) << Bitfield << PreferredTypeDiagIndex << ED;
10624+
S.Diag(InitLoc, DiagID) << Bitfield << ED;
1061910625
TypeSourceInfo *TSI = Bitfield->getTypeSourceInfo();
1062010626
SourceRange TypeRange =
1062110627
TSI ? TSI->getTypeLoc().getSourceRange() : SourceRange();
@@ -10636,8 +10642,11 @@ static bool AnalyzeBitFieldAssignment(Sema &S, FieldDecl *Bitfield, Expr *Init,
1063610642
// Check the bitwidth.
1063710643
if (BitsNeeded > FieldWidth) {
1063810644
Expr *WidthExpr = Bitfield->getBitWidth();
10639-
S.Diag(InitLoc, diag::warn_bitfield_too_small_for_enum)
10640-
<< Bitfield << PreferredTypeDiagIndex << ED;
10645+
auto DiagID =
10646+
PTAttr == nullptr
10647+
? diag::warn_bitfield_too_small_for_enum
10648+
: diag::warn_preferred_type_bitfield_too_small_for_enum;
10649+
S.Diag(InitLoc, DiagID) << Bitfield << ED;
1064110650
S.Diag(WidthExpr->getExprLoc(), diag::note_widen_bitfield)
1064210651
<< BitsNeeded << ED << WidthExpr->getSourceRange();
1064310652
if (PTAttr)

clang/test/Sema/bitfield-preferred-type-sizing.c

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fsyntax-only -verify -std=c11 -Wno-unused-value -Wno-unused-but-set-variable -Wbitfield-width -Wbitfield-enum-conversion
1+
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fsyntax-only -verify=expected,preferrednotes -std=c11 -Wno-unused-value -Wno-unused-but-set-variable
2+
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fsyntax-only -verify=expected,bitfieldwarning,preferrednotes -std=c11 -Wno-unused-value -Wno-unused-but-set-variable -Wbitfield-width -Wbitfield-enum-conversion
3+
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fsyntax-only -verify=noerror,preferrednotes -std=c11 -Wno-unused-value -Wno-unused-but-set-variable -Wno-error=preferred-type-bitfield-enum-conversion -Wno-error=preferred-type-bitfield-width
24

35
enum A {
46
A_a,
@@ -40,21 +42,21 @@ void read_enum(struct S *s) {
4042

4143
void write_enum(struct S *s, enum A x) {
4244
s->a1 = x;
43-
// expected-warning@-1 {{bit-field 'a1' is not wide enough to store all enumerators of 'A'}}
44-
// expected-note@#S_a1_decl {{widen this field to 2 bits to store all values of 'A'}}
45+
// bitfieldwarning-warning@-1 {{bit-field 'a1' is not wide enough to store all enumerators of 'A'}}
46+
// bitfieldwarning-note@#S_a1_decl {{widen this field to 2 bits to store all values of 'A'}}
4547
s->a2 = x;
4648
s->a3 = x;
4749
s->a4 = x;
48-
// expected-warning@-1 {{bit-field 'a4' is not wide enough to store all enumerators of 'A'}}
49-
// expected-note@#S_a4_decl {{widen this field to 2 bits to store all values of 'A'}}
50+
// bitfieldwarning-warning@-1 {{bit-field 'a4' is not wide enough to store all enumerators of 'A'}}
51+
// bitfieldwarning-note@#S_a4_decl {{widen this field to 2 bits to store all values of 'A'}}
5052
s->a5 = x;
5153
s->a6 = x;
5254
s->a7 = x;
53-
// expected-warning@-1 {{bit-field 'a7' is not wide enough to store all enumerators of 'A'}}
54-
// expected-note@#S_a7_decl {{widen this field to 2 bits to store all values of 'A'}}
55+
// bitfieldwarning-warning@-1 {{bit-field 'a7' is not wide enough to store all enumerators of 'A'}}
56+
// bitfieldwarning-note@#S_a7_decl {{widen this field to 2 bits to store all values of 'A'}}
5557
s->a8 = x;
56-
// expected-warning@-1 {{signed bit-field 'a8' needs an extra bit to represent the largest positive enumerators of 'A'}}
57-
// expected-note@#S_a8_decl {{consider making the bitfield type unsigned}}
58+
// bitfieldwarning-warning@-1 {{signed bit-field 'a8' needs an extra bit to represent the largest positive enumerators of 'A'}}
59+
// bitfieldwarning-note@#S_a8_decl {{consider making the bit-field type unsigned}}
5860
s->a9 = x;
5961
}
6062

@@ -63,19 +65,22 @@ void write_enum_int(struct S *s, int x) {
6365
s->a2 = x;
6466
s->a3 = x;
6567
s->a4 = x;
66-
// expected-warning@-1 {{bit-field 'a4' is not wide enough to store all enumerators of preferred type 'A'}}
67-
// expected-note@#S_a4_decl {{widen this field to 2 bits to store all values of 'A'}}
68-
// expected-note@#preferred_S_a4 {{preferred type for bitfield 'A' specified here}}
68+
// expected-error@-1 {{bit-field 'a4' is not wide enough to store all enumerators of preferred type 'A'}}
69+
// noerror-warning@-2 {{bit-field 'a4' is not wide enough to store all enumerators of preferred type 'A'}}
70+
// preferrednotes-note@#S_a4_decl {{widen this field to 2 bits to store all values of 'A'}}
71+
// preferrednotes-note@#preferred_S_a4 {{preferred type for bit-field 'A' specified here}}
6972
s->a5 = x;
7073
s->a6 = x;
7174
s->a7 = x;
72-
// expected-warning@-1 {{bit-field 'a7' is not wide enough to store all enumerators of preferred type 'A'}}
73-
// expected-note@#S_a7_decl {{widen this field to 2 bits to store all values of 'A'}}
74-
// expected-note@#preferred_S_a7 {{preferred type for bitfield 'A' specified here}}
75+
// expected-error@-1 {{bit-field 'a7' is not wide enough to store all enumerators of preferred type 'A'}}
76+
// noerror-warning@-2 {{bit-field 'a7' is not wide enough to store all enumerators of preferred type 'A'}}
77+
// preferrednotes-note@#S_a7_decl {{widen this field to 2 bits to store all values of 'A'}}
78+
// preferrednotes-note@#preferred_S_a7 {{preferred type for bit-field 'A' specified here}}
7579
s->a8 = x;
76-
// expected-warning@-1 {{signed bit-field 'a8' needs an extra bit to represent the largest positive enumerators of preferred type 'A'}}
77-
// expected-note@#S_a8_decl {{consider making the bitfield type unsigned}}
78-
// expected-note@#preferred_S_a8 {{preferred type for bitfield 'A' specified here}}
80+
// expected-error@-1 {{signed bit-field 'a8' needs an extra bit to represent the largest positive enumerators of preferred type 'A'}}
81+
// noerror-warning@-2 {{signed bit-field 'a8' needs an extra bit to represent the largest positive enumerators of preferred type 'A'}}
82+
// preferrednotes-note@#S_a8_decl {{consider making the bit-field type unsigned}}
83+
// preferrednotes-note@#preferred_S_a8 {{preferred type for bit-field 'A' specified here}}
7984
s->a9 = x;
8085
}
8186

@@ -93,16 +98,16 @@ void write_low_constant(struct S *s) {
9398

9499
void write_high_constant(struct S *s) {
95100
s->a1 = A_d;
96-
// expected-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to 1}}
101+
// preferrednotes-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to 1}}
97102
s->a2 = A_d;
98103
s->a3 = A_d;
99104
s->a4 = A_d;
100-
// expected-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to 1}}
105+
// preferrednotes-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to 1}}
101106
s->a5 = A_d;
102107
s->a6 = A_d;
103108
s->a7 = A_d;
104-
// expected-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to -1}}
109+
// preferrednotes-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to -1}}
105110
s->a8 = A_d;
106-
// expected-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to -1}}
111+
// preferrednotes-warning@-1 {{implicit truncation from 'int' to bit-field changes value from 3 to -1}}
107112
s->a9 = A_d;
108113
};

0 commit comments

Comments
 (0)