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
6long t0() {
7 return 1 * 4;
8}
9
10unsigned long t1() {
11 const int a = 2;
12 const int b = 3;
13 return a * b;
14}
15
16long t2() {
17 constexpr int a = 16383; // ~1/2 of int16_t max
18 constexpr int b = 2;
19 return a * b;
20}
21
22constexpr int global_value() {
23 return 16;
24}
25
26unsigned long t3() {
27 constexpr int a = 3;
28 return a * global_value();
29}
30
31long t4() {
32 const char a = 3;
33 const short b = 2;
34 const int c = 5;
35 return c * b * a;
36}
37
38long t5() {
39 constexpr int min_int = (-2147483647 - 1); // A literal of -2147483648 evaluates to long
40 return 1 * min_int;
41}
42
43unsigned 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
53double n1() {
54 const long a = 100000000;
55 return a * 400;
56}
57

source code of clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-constants.cpp