Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ Improvements to Clang's diagnostics
- The ``-Wunsafe-buffer-usage`` warning has been updated to warn
about unsafe libc function calls. Those new warnings are emitted
under the subgroup ``-Wunsafe-buffer-usage-in-libc-call``.
- The ``-Wshift-bool`` warning has been added to warn about shifting a boolean. (#GH28334)

Improvements to Clang's time-trace
----------------------------------
Expand Down
3 changes: 3 additions & 0 deletions clang/include/clang/Basic/DiagnosticSemaKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -7106,6 +7106,9 @@ def warn_shift_result_sets_sign_bit : Warning<
"signed shift result (%0) sets the sign bit of the shift expression's "
"type (%1) and becomes negative">,
InGroup<DiagGroup<"shift-sign-overflow">>, DefaultIgnore;
def warn_shift_bool : Warning<
"right shifting a `bool` implicitly converts it to 'int'">,
InGroup<DiagGroup<"shift-bool">>, DefaultIgnore;

def warn_precedence_bitwise_rel : Warning<
"%0 has lower precedence than %1; %1 will be evaluated first">,
Expand Down
6 changes: 6 additions & 0 deletions clang/lib/Sema/SemaExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11250,6 +11250,12 @@ static void DiagnoseBadShiftValues(Sema& S, ExprResult &LHS, ExprResult &RHS,
if (S.getLangOpts().OpenCL)
return;

if (Opc == BO_Shr &&
LHS.get()->IgnoreParenImpCasts()->getType()->isBooleanType()) {
S.Diag(Loc, diag::warn_shift_bool) << LHS.get()->getSourceRange();
return;
}

// Check right/shifter operand
Expr::EvalResult RHSResult;
if (RHS.get()->isValueDependent() ||
Expand Down
12 changes: 12 additions & 0 deletions clang/test/Sema/shift-bool.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// RUN: %clang_cc1 -fsyntax-only -Wshift-bool -verify %s

void t() {
int x = 10;
bool y = true;

bool a = y >> x; // expected-warning {{right shifting a `bool` implicitly converts it to 'int'}}
bool b = false >> x; // expected-warning {{right shifting a `bool` implicitly converts it to 'int'}}
bool c = y >> 5; // expected-warning {{right shifting a `bool` implicitly converts it to 'int'}}
bool d = y >> -1; // expected-warning {{right shifting a `bool` implicitly converts it to 'int'}}
bool e = y >> 0; // expected-warning {{right shifting a `bool` implicitly converts it to 'int'}}
}