forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[clang-tidy] fix false positive that floating point variable only use…
…d in increment expr in cert-flp30-c (llvm#108706) Fixes: llvm#108049 cert-flp30-c only provides non-compliant example with normal loop. Essentially it wants to avoid that floating point variables are used as loop counters which are checked in condition expr and modified in increment expr. This patch wants to give more precise matcheres to identify this cases.
- Loading branch information
1 parent
61ff1cb
commit 0c55ad1
Showing
3 changed files
with
39 additions
and
10 deletions.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,28 @@ | ||
// RUN: %check_clang_tidy %s cert-flp30-c %t | ||
|
||
float g(void); | ||
int c(float); | ||
float f = 1.0f; | ||
|
||
void match(void) { | ||
|
||
void func(void) { | ||
for (float x = 0.1f; x <= 1.0f; x += 0.1f) {} | ||
// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: loop induction expression should not have floating-point type [cert-flp30-c] | ||
// CHECK-MESSAGES: :[[@LINE-1]]:35: warning: loop induction expression should not have floating-point type [cert-flp30-c] | ||
|
||
float f = 1.0f; | ||
for (; f > 0; --f) {} | ||
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: loop induction expression | ||
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: loop induction expression should not have floating-point type [cert-flp30-c] | ||
|
||
for (;;g()) {} | ||
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: loop induction expression | ||
for (float x = 0.0f; c(x); x = g()) {} | ||
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: loop induction expression should not have floating-point type [cert-flp30-c] | ||
|
||
for (int i = 0; i < 10; i += 1.0f) {} | ||
for (int i=0; i < 10 && f < 2.0f; f++, i++) {} | ||
// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: loop induction expression should not have floating-point type [cert-flp30-c] | ||
// CHECK-MESSAGES: :5:1: note: floating-point type loop induction variable | ||
} | ||
|
||
void not_match(void) { | ||
for (int i = 0; i < 10; i += 1.0f) {} | ||
for (int i = 0; i < 10; ++i) {} | ||
for (int i = 0; i < 10; ++i, f++) {} | ||
for (int i = 0; f < 10.f; ++i) {} | ||
} |