1 // RUN: %check_clang_tidy -std=c++20 %s modernize-use-designated-initializers %t \ 2 // RUN: -- \ 3 // RUN: -- -fno-delayed-template-parsing 4 // RUN: %check_clang_tidy -check-suffixes=,SINGLE-ELEMENT -std=c++20 %s modernize-use-designated-initializers %t \ 5 // RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreSingleElementAggregates: false}}" \ 6 // RUN: -- -fno-delayed-template-parsing 7 // RUN: %check_clang_tidy -check-suffixes=POD -std=c++20 %s modernize-use-designated-initializers %t \ 8 // RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.RestrictToPODTypes: true}}" \ 9 // RUN: -- -fno-delayed-template-parsing 10 // RUN: %check_clang_tidy -check-suffixes=,MACROS -std=c++20 %s modernize-use-designated-initializers %t \ 11 // RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreMacros: false}}" \ 12 // RUN: -- -fno-delayed-template-parsing 13 14 struct S1 {}; 15 16 S1 s11{}; 17 S1 s12 = {}; 18 S1 s13(); 19 S1 s14; 20 21 struct S2 { int i, j; }; 22 23 S2 s21{.i=1, .j =2}; 24 25 S2 s22 = {1, 2}; 26 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 27 // CHECK-MESSAGES: :[[@LINE-6]]:1: note: aggregate type is defined here 28 // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 29 // CHECK-MESSAGES-POD: :[[@LINE-8]]:1: note: aggregate type is defined here 30 // CHECK-FIXES: S2 s22 = {.i=1, .j=2}; 31 32 S2 s23{1}; 33 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 34 // CHECK-MESSAGES: :[[@LINE-13]]:1: note: aggregate type is defined here 35 // CHECK-MESSAGES-POD: :[[@LINE-3]]:7: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 36 // CHECK-MESSAGES-POD: :[[@LINE-15]]:1: note: aggregate type is defined here 37 // CHECK-FIXES: S2 s23{.i=1}; 38 39 S2 s24{.i = 1}; 40 41 S2 s25 = {.i=1, 2}; 42 // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 43 // CHECK-MESSAGES-POD: :[[@LINE-2]]:17: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 44 // CHECK-FIXES: S2 s25 = {.i=1, .j=2}; 45 46 class S3 { 47 public: 48 S2 s2; 49 double d; 50 }; 51 52 S3 s31 = {.s2 = 1, 2, 3.1}; 53 // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use designated init expression to initialize field 's2.j' [modernize-use-designated-initializers] 54 // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: use designated init expression to initialize field 'd' [modernize-use-designated-initializers] 55 // CHECK-MESSAGES-POD: :[[@LINE-3]]:20: warning: use designated init expression to initialize field 's2.j' [modernize-use-designated-initializers] 56 // CHECK-MESSAGES-POD: :[[@LINE-4]]:23: warning: use designated init expression to initialize field 'd' [modernize-use-designated-initializers] 57 // CHECK-FIXES: S3 s31 = {.s2 = 1, .s2.j=2, .d=3.1}; 58 59 S3 s32 = {{.i = 1, 2}}; 60 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S3' [modernize-use-designated-initializers] 61 // CHECK-MESSAGES: :[[@LINE-15]]:1: note: aggregate type is defined here 62 // CHECK-MESSAGES: :[[@LINE-3]]:20: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 63 // CHECK-MESSAGES-POD: :[[@LINE-4]]:10: warning: use designated initializer list to initialize 'S3' [modernize-use-designated-initializers] 64 // CHECK-MESSAGES-POD: :[[@LINE-18]]:1: note: aggregate type is defined here 65 // CHECK-MESSAGES-POD: :[[@LINE-6]]:20: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 66 // CHECK-FIXES: S3 s32 = {.s2={.i = 1, .j=2}}; 67 68 S3 s33 = {{2}, .d=3.1}; 69 // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use designated init expression to initialize field 's2' [modernize-use-designated-initializers] 70 // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 71 // CHECK-MESSAGES: :[[@LINE-50]]:1: note: aggregate type is defined here 72 // CHECK-MESSAGES-POD: :[[@LINE-4]]:11: warning: use designated init expression to initialize field 's2' [modernize-use-designated-initializers] 73 // CHECK-MESSAGES-POD: :[[@LINE-5]]:11: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 74 // CHECK-MESSAGES-POD: :[[@LINE-53]]:1: note: aggregate type is defined here 75 // CHECK-FIXES: S3 s33 = {.s2={.i=2}, .d=3.1}; 76 77 struct S4 { 78 double d; 79 private: static int i; 80 }; 81 82 S4 s41 {2.2}; 83 // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S4' [modernize-use-designated-initializers] 84 // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-7]]:1: note: aggregate type is defined here 85 // CHECK-FIXES-SINGLE-ELEMENT: S4 s41 {.d=2.2}; 86 87 S4 s42 = {{}}; 88 // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S4' [modernize-use-designated-initializers] 89 // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-12]]:1: note: aggregate type is defined here 90 // CHECK-FIXES-SINGLE-ELEMENT: S4 s42 = {.d={}}; 91 92 template<typename S> S template1() { return {10, 11}; } 93 94 S2 s26 = template1<S2>(); 95 96 template<typename S> S template2() { return {}; } 97 98 S2 s27 = template2<S2>(); 99 100 struct S5: S2 { int x, y; }; 101 102 S5 s51 {1, 2, .x = 3, .y = 4}; 103 104 struct S6 { 105 int i; 106 struct { int j; } s; 107 }; 108 109 S6 s61 {1, 2}; 110 // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S6' [modernize-use-designated-initializers] 111 // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here 112 // CHECK-MESSAGES-POD: :[[@LINE-3]]:8: warning: use designated initializer list to initialize 'S6' [modernize-use-designated-initializers] 113 // CHECK-MESSAGES-POD: :[[@LINE-9]]:1: note: aggregate type is defined here 114 // CHECK-FIXES: S6 s61 {.i=1, .s.j=2}; 115 116 struct S7 { 117 union { 118 int k; 119 double d; 120 } u; 121 }; 122 123 S7 s71 {1}; 124 // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S7' [modernize-use-designated-initializers] 125 // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-9]]:1: note: aggregate type is defined here 126 // CHECK-FIXES-SINGLE-ELEMENT: S7 s71 {.u.k=1}; 127 128 struct S8: S7 { int i; }; 129 130 S8 s81{1, 2}; 131 132 struct S9 { 133 int i, j; 134 S9 &operator=(S9); 135 }; 136 137 S9 s91{1, 2}; 138 // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list to initialize 'S9' [modernize-use-designated-initializers] 139 // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here 140 // CHECK-FIXES: S9 s91{.i=1, .j=2}; 141 142 struct S10 { int i = 1, j = 2; }; 143 144 S10 s101 {1, .j=2}; 145 // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers] 146 // CHECK-FIXES: S10 s101 {.i=1, .j=2}; 147 148 struct S11 { int i; S10 s10; }; 149 150 S11 s111 { .i = 1 }; 151 S11 s112 { 1 }; 152 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S11' [modernize-use-designated-initializers] 153 // CHECK-MESSAGES: :[[@LINE-5]]:1: note: aggregate type is defined here 154 // CHECK-FIXES: S11 s112 { .i=1 }; 155 156 S11 s113 { .i=1, {}}; 157 // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use designated init expression to initialize field 's10' [modernize-use-designated-initializers] 158 // CHECK-FIXES: S11 s113 { .i=1, .s10={}}; 159 160 S11 s114 { .i=1, .s10={1, .j=2}}; 161 // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers] 162 // CHECK-FIXES: S11 s114 { .i=1, .s10={.i=1, .j=2}}; 163 164 struct S12 { 165 int i; 166 struct { int j; }; 167 }; 168 169 S12 s121 {1, 2}; 170 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S12' [modernize-use-designated-initializers] 171 // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here 172 // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S12' [modernize-use-designated-initializers] 173 // CHECK-MESSAGES-POD: :[[@LINE-9]]:1: note: aggregate type is defined here 174 // CHECK-FIXES: S12 s121 {.i=1, .j=2}; 175 176 struct S13 { 177 union { 178 int k; 179 double d; 180 }; 181 int i; 182 }; 183 184 S13 s131 {1, 2}; 185 // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S13' [modernize-use-designated-initializers] 186 // CHECK-MESSAGES: :[[@LINE-10]]:1: note: aggregate type is defined here 187 // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S13' [modernize-use-designated-initializers] 188 // CHECK-MESSAGES-POD: :[[@LINE-12]]:1: note: aggregate type is defined here 189 // CHECK-FIXES: S13 s131 {.k=1, .i=2}; 190 191 #define A (3+2) 192 #define B .j=1 193 194 S9 s92 {A, B}; 195 // CHECK-MESSAGES-MACROS: :[[@LINE-1]]:9: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers] 196 // CHECK-MESSAGES-MACROS: :[[@LINE-5]]:11: note: expanded from macro 'A' 197 198 #define DECLARE_S93 S9 s93 {1, 2} 199 200 DECLARE_S93; 201 // CHECK-MESSAGES-MACROS: :[[@LINE-1]]:1: warning: use designated initializer list to initialize 'S9' [modernize-use-designated-initializers] 202 // CHECK-MESSAGES-MACROS: :[[@LINE-4]]:28: note: expanded from macro 'DECLARE_S93' 203 // CHECK-MESSAGES-MACROS: :[[@LINE-71]]:1: note: aggregate type is defined here 204 205 // Issue #113652. 206 struct S14; 207 208 struct S15{ 209 S15(S14& d):d{d}{} 210 S14& d; 211 }; 212