1// RUN: %check_clang_tidy %s bugprone-easily-swappable-parameters %t \
2// RUN: -config='{CheckOptions: { \
3// RUN: bugprone-easily-swappable-parameters.MinimumLength: 2, \
4// RUN: bugprone-easily-swappable-parameters.IgnoredParameterNames: "", \
5// RUN: bugprone-easily-swappable-parameters.IgnoredParameterTypeSuffixes: "", \
6// RUN: bugprone-easily-swappable-parameters.QualifiersMix: 0, \
7// RUN: bugprone-easily-swappable-parameters.ModelImplicitConversions: 1, \
8// RUN: bugprone-easily-swappable-parameters.SuppressParametersUsedTogether: 0, \
9// RUN: bugprone-easily-swappable-parameters.NamePrefixSuffixSilenceDissimilarityTreshold: 0 \
10// RUN: }}' --
11
12void implicitDoesntBreakOtherStuff(int A, int B) {}
13// CHECK-MESSAGES: :[[@LINE-1]]:36: warning: 2 adjacent parameters of 'implicitDoesntBreakOtherStuff' of similar type ('int') are easily swapped by mistake [bugprone-easily-swappable-parameters]
14// CHECK-MESSAGES: :[[@LINE-2]]:40: note: the first parameter in the range is 'A'
15// CHECK-MESSAGES: :[[@LINE-3]]:47: note: the last parameter in the range is 'B'
16
17void arrayAndPtr1(int *IP, int IA[]) { arrayAndPtr1(IP: IA, IA: IP); }
18// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: 2 adjacent parameters of 'arrayAndPtr1' of similar type ('int *')
19// CHECK-MESSAGES: :[[@LINE-2]]:24: note: the first parameter in the range is 'IP'
20// CHECK-MESSAGES: :[[@LINE-3]]:32: note: the last parameter in the range is 'IA'
21
22void arrayAndPtr2(int *IP, int IA[8]) { arrayAndPtr2(IP: IA, IA: IP); }
23// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: 2 adjacent parameters of 'arrayAndPtr2' of similar type ('int *')
24// CHECK-MESSAGES: :[[@LINE-2]]:24: note: the first parameter in the range is 'IP'
25// CHECK-MESSAGES: :[[@LINE-3]]:32: note: the last parameter in the range is 'IA'
26
27void arrayAndElement(int I, int IA[]) {} // NO-WARN.
28
29void numericConversion1(int I, double D) { numericConversion1(I: D, D: I); }
30// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 2 adjacent parameters of 'numericConversion1' of convertible types are easily swapped by mistake [bugprone-easily-swappable-parameters]
31// CHECK-MESSAGES: :[[@LINE-2]]:29: note: the first parameter in the range is 'I'
32// CHECK-MESSAGES: :[[@LINE-3]]:39: note: the last parameter in the range is 'D'
33// CHECK-MESSAGES: :[[@LINE-4]]:32: note: 'int' and 'double' may be implicitly converted{{$}}
34
35void numericConversion2(int I, short S) { numericConversion2(I: S, S: I); }
36// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 2 adjacent parameters of 'numericConversion2' of convertible types
37// CHECK-MESSAGES: :[[@LINE-2]]:29: note: the first parameter in the range is 'I'
38// CHECK-MESSAGES: :[[@LINE-3]]:38: note: the last parameter in the range is 'S'
39// CHECK-MESSAGES: :[[@LINE-4]]:32: note: 'int' and 'short' may be implicitly converted{{$}}
40
41void numericConversion3(float F, unsigned long UL) { numericConversion3(F: UL, UL: F); }
42// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 2 adjacent parameters of 'numericConversion3' of convertible types
43// CHECK-MESSAGES: :[[@LINE-2]]:31: note: the first parameter in the range is 'F'
44// CHECK-MESSAGES: :[[@LINE-3]]:48: note: the last parameter in the range is 'UL'
45// CHECK-MESSAGES: :[[@LINE-4]]:34: note: 'float' and 'unsigned long' may be implicitly converted{{$}}
46
47enum Unscoped { U_A,
48 U_B };
49enum UnscopedFixed : char { UF_A,
50 UF_B };
51
52void numericConversion4(int I, enum Unscoped U) { numericConversion4(U, I); }
53// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 2 adjacent parameters of 'numericConversion4' of convertible types
54// CHECK-MESSAGES: :[[@LINE-2]]:29: note: the first parameter in the range is 'I'
55// CHECK-MESSAGES: :[[@LINE-3]]:46: note: the last parameter in the range is 'U'
56// CHECK-MESSAGES: :[[@LINE-4]]:32: note: 'int' and 'enum Unscoped' may be implicitly converted{{$}}
57
58void numericConversion5(int I, enum UnscopedFixed UF) { numericConversion5(UF, I); }
59// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 2 adjacent parameters of 'numericConversion5' of convertible types
60// CHECK-MESSAGES: :[[@LINE-2]]:29: note: the first parameter in the range is 'I'
61// CHECK-MESSAGES: :[[@LINE-3]]:51: note: the last parameter in the range is 'UF'
62// CHECK-MESSAGES: :[[@LINE-4]]:32: note: 'int' and 'enum UnscopedFixed' may be implicitly converted{{$}}
63
64void numericConversion7(double D, enum Unscoped U) { numericConversion7(U, D); }
65// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 2 adjacent parameters of 'numericConversion7' of convertible types
66// CHECK-MESSAGES: :[[@LINE-2]]:32: note: the first parameter in the range is 'D'
67// CHECK-MESSAGES: :[[@LINE-3]]:49: note: the last parameter in the range is 'U'
68// CHECK-MESSAGES: :[[@LINE-4]]:35: note: 'double' and 'enum Unscoped' may be implicitly converted{{$}}
69
70void numericConversion8(double D, enum UnscopedFixed UF) { numericConversion8(UF, D); }
71// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: 2 adjacent parameters of 'numericConversion8' of convertible types
72// CHECK-MESSAGES: :[[@LINE-2]]:32: note: the first parameter in the range is 'D'
73// CHECK-MESSAGES: :[[@LINE-3]]:54: note: the last parameter in the range is 'UF'
74// CHECK-MESSAGES: :[[@LINE-4]]:35: note: 'double' and 'enum UnscopedFixed' may be implicitly converted{{$}}
75
76void pointeeConversion(int *IP, double *DP) { pointeeConversion(DP, IP); }
77// NO-WARN: Even though this is possible in C, a swap is diagnosed by the compiler.
78

source code of clang-tools-extra/test/clang-tidy/checkers/bugprone/easily-swappable-parameters-implicits.c