1 | // RUN: %check_clang_tidy %s bugprone-implicit-widening-of-multiplication-result %t -- \ |
2 | // RUN: -config='{CheckOptions: { \ |
3 | // RUN: bugprone-implicit-widening-of-multiplication-result.IgnoreConstantIntExpr: true \ |
4 | // RUN: }}' -- -target x86_64-unknown-unknown -x c++ |
5 | |
6 | long t0() { |
7 | return 1 * 4; |
8 | } |
9 | |
10 | unsigned long t1() { |
11 | const int a = 2; |
12 | const int b = 3; |
13 | return a * b; |
14 | } |
15 | |
16 | long t2() { |
17 | constexpr int a = 16383; // ~1/2 of int16_t max |
18 | constexpr int b = 2; |
19 | return a * b; |
20 | } |
21 | |
22 | constexpr int global_value() { |
23 | return 16; |
24 | } |
25 | |
26 | unsigned long t3() { |
27 | constexpr int a = 3; |
28 | return a * global_value(); |
29 | } |
30 | |
31 | long t4() { |
32 | const char a = 3; |
33 | const short b = 2; |
34 | const int c = 5; |
35 | return c * b * a; |
36 | } |
37 | |
38 | long t5() { |
39 | constexpr int min_int = (-2147483647 - 1); // A literal of -2147483648 evaluates to long |
40 | return 1 * min_int; |
41 | } |
42 | |
43 | unsigned long n0() { |
44 | const int a = 1073741824; // 1/2 of int32_t max |
45 | const int b = 3; |
46 | return a * b; |
47 | // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'unsigned long' of a multiplication performed in type 'int' |
48 | // CHECK-MESSAGES: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning |
49 | // CHECK-MESSAGES: static_cast<unsigned long>( ) |
50 | // CHECK-MESSAGES: :[[@LINE-4]]:10: note: perform multiplication in a wider type |
51 | } |
52 | |
53 | double n1() { |
54 | const long a = 100000000; |
55 | return a * 400; |
56 | } |
57 | |