================
@@ -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

Reply via email to