================
@@ -0,0 +1,152 @@
+// RUN: %check_clang_tidy -std=c++98-or-later %s readability-trailing-comma %t
+
+struct S { int x, y; };
+
+enum E1 {
+ A,
+ B,
+ C
+};
+// CHECK-MESSAGES: :[[@LINE-2]]:4: warning: enum should have a trailing comma
[readability-trailing-comma]
+// CHECK-FIXES: enum E1 {
+// CHECK-FIXES-NEXT: A,
+// CHECK-FIXES-NEXT: B,
+// CHECK-FIXES-NEXT: C,
+// CHECK-FIXES-NEXT: };
+
+enum E2 {
+ V = 1
+};
+// CHECK-MESSAGES: :[[@LINE-2]]:8: warning: enum should have a trailing comma
+// CHECK-FIXES: enum E2 {
+// CHECK-FIXES-NEXT: V = 1,
+// CHECK-FIXES-NEXT: };
+
+enum SingleLine { A1, B1, C1 };
+
+enum E3 {
+ P,
+ Q,
+};
+
+enum SingleEnum1 { ONE };
+enum SingleEnum2 { TWO, };
+// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: enum should not have a trailing
comma
+// CHECK-FIXES: enum SingleEnum2 { TWO };
+enum SingleEnum3 {
+ THREE
+};
+// CHECK-MESSAGES: :[[@LINE-2]]:8: warning: enum should have a trailing comma
+// CHECK-FIXES: enum SingleEnum3 {
+// CHECK-FIXES-NEXT: THREE,
+// CHECK-FIXES-NEXT: };
+enum SingleEnum4 {
+ FOUR,
+};
+
+enum Empty {};
+
+void f() {
+ int a[] = {
+ 1
+ };
+ // CHECK-MESSAGES: :[[@LINE-2]]:6: warning: initializer list should have a
trailing comma
+ // CHECK-FIXES: int a[] = {
+ // CHECK-FIXES-NEXT: 1,
+ // CHECK-FIXES-NEXT: };
+
+ S s = {
+ 1,
+ 2
+ };
+ // CHECK-MESSAGES: :[[@LINE-2]]:6: warning: initializer list should have a
trailing comma
+ // CHECK-FIXES: S s = {
+ // CHECK-FIXES-NEXT: 1,
+ // CHECK-FIXES-NEXT: 2,
+ // CHECK-FIXES-NEXT: };
+
+ int b[] = {1, 2, 3};
+ S s2 = {1, 2};
+
+ int e[] = {1, 2, 3,};
+ // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: initializer list should not
have a trailing comma
+ // CHECK-FIXES: int e[] = {1, 2, 3};
+
+ int c[] = {
+ 1,
+ 2,
+ };
+ int d[] = {};
+
+ int single1[] = {1};
+ int single2[] = {1,};
+ // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: initializer list should not
have a trailing comma
+ // CHECK-FIXES: int single2[] = {1};
+ int single3[] = {
+ 1
+ };
+ // CHECK-MESSAGES: :[[@LINE-2]]:6: warning: initializer list should have a
trailing comma
+ // CHECK-FIXES: int single3[] = {
+ // CHECK-FIXES-NEXT: 1,
+ // CHECK-FIXES-NEXT: };
+ int single4[] = {
+ 1,
+ };
+ S singleS1 = {42};
+ S singleS2 = {42,};
+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: initializer list should not
have a trailing comma
+ // CHECK-FIXES: S singleS2 = {42};
+}
+
+struct N { S a, b; };
+void nested() {
+ N n = {{1, 2}, {3, 4}};
+ N n2 = {{3, 4,},};
+ // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: initializer list should not
have a trailing comma
+ // CHECK-MESSAGES: :[[@LINE-2]]:18: warning: initializer list should not
have a trailing comma
+ // CHECK-FIXES: N n2 = {{[{][{]3, 4[}][}]}};
+}
+
+void nestedMultiLine() {
+ N n = {
+ {1, 2},
+ {3, 4}
+ };
+ // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: initializer list should have a
trailing comma
+ // CHECK-FIXES: N n = {
+ // CHECK-FIXES-NEXT: {1, 2},
+ // CHECK-FIXES-NEXT: {3, 4},
+ // CHECK-FIXES-NEXT: };
+
+ N n2 = {
+ {1, 2},
+ {3, 4},
+ };
+
+ struct Container { int arr[3]; };
+ Container c1 = {{}};
+ Container c2 = {{},};
+ // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: initializer list should not
have a trailing comma
+ // CHECK-FIXES: Container c2 = {{[{][{][}][}]}};
+
+ struct Wrapper { S s; };
+ Wrapper w1 = {{1}};
+ Wrapper w2 = {{1,}};
+ // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: initializer list should not
have a trailing comma
+ // CHECK-FIXES: Wrapper w2 = {{[{][{]1[}][}]}};
+
+ Wrapper w3 = {
+ {1}
+ };
+ // CHECK-MESSAGES: :[[@LINE-2]]:8: warning: initializer list should have a
trailing comma
+ // CHECK-FIXES: Wrapper w3 = {
+ // CHECK-FIXES-NEXT: {1},
+ // CHECK-FIXES-NEXT: };
+}
+
+// Macros are ignored
+#define ENUM(n, a, b) enum n { a, b }
+#define INIT {1, 2}
+
+ENUM(E1M, Xm, Ym);
+int macroArr[] = INIT;
----------------
zeyi2 wrote:
Could we add a new testcase where the elements is from macros?
e.g.
```c++
#define ITEMS 1,2
int a[] = { ITEMS };
```
If this testcase couldn't work as expected, I think it is reasonable to add an
early return in `checkInitListExpr`:
```c++
if (LastInit->getEndLoc().isMacroID())
return;
```
https://github.com/llvm/llvm-project/pull/173669
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits