1// RUN: %check_clang_tidy %s bugprone-swapped-arguments %t
2
3void F(int, double);
4
5int SomeFunction();
6
7template <typename T, typename U>
8void G(T a, U b) {
9 F(a, b); // no-warning
10 F(2.0, 4);
11// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'int' followed by argument converted from 'int' to 'double', potentially swapped arguments.
12// CHECK-FIXES: F(4, 2.0)
13}
14
15void funShortFloat(short, float);
16void funFloatFloat(float, float);
17void funBoolShort(bool, short);
18void funBoolFloat(bool, float);
19
20void foo() {
21 F(1.0, 3);
22// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'int' followed by argument converted from 'int' to 'double', potentially swapped arguments.
23// CHECK-FIXES: F(3, 1.0)
24
25#define M(x, y) x##y()
26
27 double b = 1.0;
28 F(b, M(Some, Function));
29// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'int' followed by argument converted from 'int' to 'double', potentially swapped arguments.
30// CHECK-FIXES: F(M(Some, Function), b);
31
32#define N F(b, SomeFunction())
33
34 N;
35// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'int' followed by argument converted from 'int' to 'double', potentially swapped arguments.
36// In macro, don't emit fixits.
37// CHECK-FIXES: #define N F(b, SomeFunction())
38
39 G(a: b, b: 3);
40 G(a: 3, b: 1.0);
41 G(a: 0, b: 0);
42
43 F(1.0, 1.0); // no-warning
44 F(3, 1.0); // no-warning
45 F(true, false); // no-warning
46 F(0, 'c'); // no-warning
47
48#define APPLY(f, x, y) f(x, y)
49 APPLY(F, 1.0, 3);
50// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: argument with implicit conversion from 'double' to 'int' followed by argument converted from 'int' to 'double', potentially swapped arguments.
51// CHECK-FIXES: APPLY(F, 3, 1.0);
52
53#define PARAMS 1.0, 3
54#define CALL(P) F(P)
55 CALL(PARAMS);
56// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'int' followed by argument converted from 'int' to 'double', potentially swapped arguments.
57// In macro, don't emit fixits.
58
59 funShortFloat(5.0, 1U);
60 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'short' followed by argument converted from 'unsigned int' to 'float', potentially swapped arguments.
61 // CHECK-FIXES: funShortFloat(1U, 5.0);
62 funShortFloat(5.0, 1);
63 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'short' followed by argument converted from 'int' to 'float', potentially swapped arguments.
64 // CHECK-FIXES: funShortFloat(1, 5.0);
65 funShortFloat(5.0f, 1);
66 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'float' to 'short' followed by argument converted from 'int' to 'float', potentially swapped arguments.
67 // CHECK-FIXES: funShortFloat(1, 5.0f);
68
69 funFloatFloat(1.0f, 2.0);
70
71 funBoolShort(1U, true);
72 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'unsigned int' to 'bool' followed by argument converted from 'bool' to 'short', potentially swapped arguments.
73 // CHECK-FIXES: funBoolShort(true, 1U);
74
75 funBoolFloat(1.0, true);
76 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: argument with implicit conversion from 'double' to 'bool' followed by argument converted from 'bool' to 'float', potentially swapped arguments.
77 // CHECK-FIXES: funBoolFloat(true, 1.0);
78}
79

source code of clang-tools-extra/test/clang-tidy/checkers/bugprone/swapped-arguments.cpp