189a1d03eSRichard // RUN: %check_clang_tidy -check-suffixes=ALL,C -std=c99 %s bugprone-implicit-widening-of-multiplication-result %t -- -- -target x86_64-unknown-unknown -x c
289a1d03eSRichard // RUN: %check_clang_tidy -check-suffixes=ALL,CXX %s bugprone-implicit-widening-of-multiplication-result %t -- -- -target x86_64-unknown-unknown -x c++
389a1d03eSRichard 
489a1d03eSRichard // RUN: %check_clang_tidy -check-suffixes=ALL,C -std=c99 %s bugprone-implicit-widening-of-multiplication-result %t -- \
5*e8a3ddafSNathan James // RUN:     -config='{CheckOptions: { \
6*e8a3ddafSNathan James // RUN:         bugprone-implicit-widening-of-multiplication-result.UseCXXStaticCastsInCppSources: false \
7*e8a3ddafSNathan James // RUN:     }}' -- -target x86_64-unknown-unknown -x c
889a1d03eSRichard // RUN: %check_clang_tidy -check-suffixes=ALL,C %s bugprone-implicit-widening-of-multiplication-result %t -- \
9*e8a3ddafSNathan James // RUN:     -config='{CheckOptions: { \
10*e8a3ddafSNathan James // RUN:         bugprone-implicit-widening-of-multiplication-result.UseCXXStaticCastsInCppSources: false \
11*e8a3ddafSNathan James // RUN:     }}' -- -target x86_64-unknown-unknown -x c++
1289a1d03eSRichard 
t0(int a,int b)1389a1d03eSRichard long t0(int a, int b) {
1489a1d03eSRichard   return a * b;
1589a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'long' of a multiplication performed in type 'int'
1689a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
1789a1d03eSRichard   // CHECK-NOTES-C:                    (long)( )
1889a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<long>( )
1989a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type
2089a1d03eSRichard   // CHECK-NOTES-C:                    (long)
2189a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<long>( )
2289a1d03eSRichard }
t1(int a,int b)2389a1d03eSRichard unsigned long t1(int a, int b) {
2489a1d03eSRichard   return a * b;
2589a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'unsigned long' of a multiplication performed in type 'int'
2689a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
2789a1d03eSRichard   // CHECK-NOTES-C:                    (unsigned long)( )
2889a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<unsigned long>( )
2989a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type
3089a1d03eSRichard   // CHECK-NOTES-C:                    (long)
3189a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<long>( )
3289a1d03eSRichard }
3389a1d03eSRichard 
t2(unsigned int a,int b)3489a1d03eSRichard long t2(unsigned int a, int b) {
3589a1d03eSRichard   return a * b;
3689a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'long' of a multiplication performed in type 'unsigned int'
3789a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
3889a1d03eSRichard   // CHECK-NOTES-C:                    (long)( )
3989a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<long>( )
4089a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type
4189a1d03eSRichard   // CHECK-NOTES-C:                    (unsigned long)
4289a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<unsigned long>( )
4389a1d03eSRichard }
t3(unsigned int a,int b)4489a1d03eSRichard unsigned long t3(unsigned int a, int b) {
4589a1d03eSRichard   return a * b;
4689a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'unsigned long' of a multiplication performed in type 'unsigned int'
4789a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
4889a1d03eSRichard   // CHECK-NOTES-C:                    (unsigned long)( )
4989a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<unsigned long>( )
5089a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type
5189a1d03eSRichard   // CHECK-NOTES-C:                    (unsigned long)
5289a1d03eSRichard   // CHECK-NOTES-CXX:                  static_cast<unsigned long>( )
5389a1d03eSRichard }
5489a1d03eSRichard 
t4(int a,unsigned int b)5589a1d03eSRichard long t4(int a, unsigned int b) {
5689a1d03eSRichard   return a * b;
5789a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'long' of a multiplication performed in type 'unsigned int'
5889a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
5989a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-3]]:10: note: perform multiplication in a wider type
6089a1d03eSRichard }
t5(int a,unsigned int b)6189a1d03eSRichard unsigned long t5(int a, unsigned int b) {
6289a1d03eSRichard   return a * b;
6389a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'unsigned long' of a multiplication performed in type 'unsigned int'
6489a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
6589a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-3]]:10: note: perform multiplication in a wider type
6689a1d03eSRichard }
6789a1d03eSRichard 
t6(unsigned int a,unsigned int b)6889a1d03eSRichard long t6(unsigned int a, unsigned int b) {
6989a1d03eSRichard   return a * b;
7089a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'long' of a multiplication performed in type 'unsigned int'
7189a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
7289a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-3]]:10: note: perform multiplication in a wider type
7389a1d03eSRichard }
t7(unsigned int a,unsigned int b)7489a1d03eSRichard unsigned long t7(unsigned int a, unsigned int b) {
7589a1d03eSRichard   return a * b;
7689a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'unsigned long' of a multiplication performed in type 'unsigned int'
7789a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
7889a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-3]]:10: note: perform multiplication in a wider type
7989a1d03eSRichard }
8089a1d03eSRichard 
t8(int a,int b)8189a1d03eSRichard long t8(int a, int b) {
8289a1d03eSRichard   return (a * b);
8389a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:11: warning: performing an implicit widening conversion to type 'long' of a multiplication performed in type 'int'
8489a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:11: note: make conversion explicit to silence this warning
8589a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-3]]:11: note: perform multiplication in a wider type
8689a1d03eSRichard }
t9(int a,int b)8789a1d03eSRichard long t9(int a, int b) {
8889a1d03eSRichard   return (a)*b;
8989a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-1]]:10: warning: performing an implicit widening conversion to type 'long' of a multiplication performed in type 'int'
9089a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-2]]:10: note: make conversion explicit to silence this warning
9189a1d03eSRichard   // CHECK-NOTES-ALL: :[[@LINE-3]]:10: note: perform multiplication in a wider type
9289a1d03eSRichard }
n10(int a,int b)9389a1d03eSRichard long n10(int a, int b) {
9489a1d03eSRichard   return (long)(a * b);
9589a1d03eSRichard }
n11(int a,int b)9689a1d03eSRichard long n11(int a, int b) {
9789a1d03eSRichard   return (unsigned long)(a * b);
9889a1d03eSRichard }
9989a1d03eSRichard 
n12(long a,int b)10089a1d03eSRichard long n12(long a, int b) {
10189a1d03eSRichard   return a * b;
10289a1d03eSRichard }
n13(int a,long b)10389a1d03eSRichard long n13(int a, long b) {
10489a1d03eSRichard   return a * b;
10589a1d03eSRichard }
10689a1d03eSRichard 
n14(int a,int b,int c)10789a1d03eSRichard long n14(int a, int b, int c) {
10889a1d03eSRichard   return a + b * c;
10989a1d03eSRichard }
n15(int a,int b,int c)11089a1d03eSRichard long n15(int a, int b, int c) {
11189a1d03eSRichard   return a * b + c;
11289a1d03eSRichard }
11389a1d03eSRichard 
11489a1d03eSRichard #ifdef __cplusplus
11589a1d03eSRichard template <typename T1, typename T2>
template_test(T1 a,T1 b)11689a1d03eSRichard T2 template_test(T1 a, T1 b) {
11789a1d03eSRichard   return a * b;
11889a1d03eSRichard }
template_test_instantiation(int a,int b)11989a1d03eSRichard long template_test_instantiation(int a, int b) {
12089a1d03eSRichard   return template_test<int, long>(a, b);
12189a1d03eSRichard }
12289a1d03eSRichard #endif
123