131b84d45SPiotr Zegar // RUN: %check_clang_tidy -std=c++20 %s modernize-use-designated-initializers %t \ 2525fe449SDanny Mösch // RUN: -- \ 3525fe449SDanny Mösch // RUN: -- -fno-delayed-template-parsing 431b84d45SPiotr Zegar // RUN: %check_clang_tidy -check-suffixes=,SINGLE-ELEMENT -std=c++20 %s modernize-use-designated-initializers %t \ 5525fe449SDanny Mösch // RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreSingleElementAggregates: false}}" \ 6525fe449SDanny Mösch // RUN: -- -fno-delayed-template-parsing 731b84d45SPiotr Zegar // RUN: %check_clang_tidy -check-suffixes=POD -std=c++20 %s modernize-use-designated-initializers %t \ 8525fe449SDanny Mösch // RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.RestrictToPODTypes: true}}" \ 9525fe449SDanny Mösch // RUN: -- -fno-delayed-template-parsing 1031b84d45SPiotr Zegar // RUN: %check_clang_tidy -check-suffixes=,MACROS -std=c++20 %s modernize-use-designated-initializers %t \ 11525fe449SDanny Mösch // RUN: -- -config="{CheckOptions: {modernize-use-designated-initializers.IgnoreMacros: false}}" \ 12525fe449SDanny Mösch // RUN: -- -fno-delayed-template-parsing 13525fe449SDanny Mösch 14525fe449SDanny Mösch struct S1 {}; 15525fe449SDanny Mösch 16525fe449SDanny Mösch S1 s11{}; 17525fe449SDanny Mösch S1 s12 = {}; 18525fe449SDanny Mösch S1 s13(); 19525fe449SDanny Mösch S1 s14; 20525fe449SDanny Mösch 21525fe449SDanny Mösch struct S2 { int i, j; }; 22525fe449SDanny Mösch 23525fe449SDanny Mösch S2 s21{.i=1, .j =2}; 24525fe449SDanny Mösch 25525fe449SDanny Mösch S2 s22 = {1, 2}; 26525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 27525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-6]]:1: note: aggregate type is defined here 28525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 29525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-8]]:1: note: aggregate type is defined here 30525fe449SDanny Mösch // CHECK-FIXES: S2 s22 = {.i=1, .j=2}; 31525fe449SDanny Mösch 32525fe449SDanny Mösch S2 s23{1}; 33525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 34525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-13]]:1: note: aggregate type is defined here 35525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:7: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 36525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-15]]:1: note: aggregate type is defined here 37525fe449SDanny Mösch // CHECK-FIXES: S2 s23{.i=1}; 38525fe449SDanny Mösch 39525fe449SDanny Mösch S2 s24{.i = 1}; 40525fe449SDanny Mösch 41525fe449SDanny Mösch S2 s25 = {.i=1, 2}; 42525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 43525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-2]]:17: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 44525fe449SDanny Mösch // CHECK-FIXES: S2 s25 = {.i=1, .j=2}; 45525fe449SDanny Mösch 46525fe449SDanny Mösch class S3 { 47525fe449SDanny Mösch public: 48525fe449SDanny Mösch S2 s2; 49525fe449SDanny Mösch double d; 50525fe449SDanny Mösch }; 51525fe449SDanny Mösch 52525fe449SDanny Mösch S3 s31 = {.s2 = 1, 2, 3.1}; 53525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use designated init expression to initialize field 's2.j' [modernize-use-designated-initializers] 54525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: use designated init expression to initialize field 'd' [modernize-use-designated-initializers] 55525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:20: warning: use designated init expression to initialize field 's2.j' [modernize-use-designated-initializers] 56525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-4]]:23: warning: use designated init expression to initialize field 'd' [modernize-use-designated-initializers] 57525fe449SDanny Mösch // CHECK-FIXES: S3 s31 = {.s2 = 1, .s2.j=2, .d=3.1}; 58525fe449SDanny Mösch 59525fe449SDanny Mösch S3 s32 = {{.i = 1, 2}}; 60525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S3' [modernize-use-designated-initializers] 61525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-15]]:1: note: aggregate type is defined here 62525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-3]]:20: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 63525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-4]]:10: warning: use designated initializer list to initialize 'S3' [modernize-use-designated-initializers] 64525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-18]]:1: note: aggregate type is defined here 65525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-6]]:20: warning: use designated init expression to initialize field 'j' [modernize-use-designated-initializers] 66525fe449SDanny Mösch // CHECK-FIXES: S3 s32 = {.s2={.i = 1, .j=2}}; 67525fe449SDanny Mösch 68525fe449SDanny Mösch S3 s33 = {{2}, .d=3.1}; 69525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use designated init expression to initialize field 's2' [modernize-use-designated-initializers] 70525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 71525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-50]]:1: note: aggregate type is defined here 72525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-4]]:11: warning: use designated init expression to initialize field 's2' [modernize-use-designated-initializers] 73525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-5]]:11: warning: use designated initializer list to initialize 'S2' [modernize-use-designated-initializers] 74525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-53]]:1: note: aggregate type is defined here 75525fe449SDanny Mösch // CHECK-FIXES: S3 s33 = {.s2={.i=2}, .d=3.1}; 76525fe449SDanny Mösch 77525fe449SDanny Mösch struct S4 { 78525fe449SDanny Mösch double d; 79525fe449SDanny Mösch private: static int i; 80525fe449SDanny Mösch }; 81525fe449SDanny Mösch 82525fe449SDanny Mösch S4 s41 {2.2}; 83525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S4' [modernize-use-designated-initializers] 84525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-7]]:1: note: aggregate type is defined here 85525fe449SDanny Mösch // CHECK-FIXES-SINGLE-ELEMENT: S4 s41 {.d=2.2}; 86525fe449SDanny Mösch 87525fe449SDanny Mösch S4 s42 = {{}}; 88525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S4' [modernize-use-designated-initializers] 89525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-12]]:1: note: aggregate type is defined here 90525fe449SDanny Mösch // CHECK-FIXES-SINGLE-ELEMENT: S4 s42 = {.d={}}; 91525fe449SDanny Mösch 92525fe449SDanny Mösch template<typename S> S template1() { return {10, 11}; } 93525fe449SDanny Mösch 94525fe449SDanny Mösch S2 s26 = template1<S2>(); 95525fe449SDanny Mösch 96525fe449SDanny Mösch template<typename S> S template2() { return {}; } 97525fe449SDanny Mösch 98525fe449SDanny Mösch S2 s27 = template2<S2>(); 99525fe449SDanny Mösch 100525fe449SDanny Mösch struct S5: S2 { int x, y; }; 101525fe449SDanny Mösch 102525fe449SDanny Mösch S5 s51 {1, 2, .x = 3, .y = 4}; 103525fe449SDanny Mösch 104525fe449SDanny Mösch struct S6 { 105525fe449SDanny Mösch int i; 106525fe449SDanny Mösch struct { int j; } s; 107525fe449SDanny Mösch }; 108525fe449SDanny Mösch 109525fe449SDanny Mösch S6 s61 {1, 2}; 110525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S6' [modernize-use-designated-initializers] 111525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here 112525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:8: warning: use designated initializer list to initialize 'S6' [modernize-use-designated-initializers] 113525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-9]]:1: note: aggregate type is defined here 114525fe449SDanny Mösch // CHECK-FIXES: S6 s61 {.i=1, .s.j=2}; 115525fe449SDanny Mösch 116525fe449SDanny Mösch struct S7 { 117525fe449SDanny Mösch union { 118525fe449SDanny Mösch int k; 119525fe449SDanny Mösch double d; 120525fe449SDanny Mösch } u; 121525fe449SDanny Mösch }; 122525fe449SDanny Mösch 123525fe449SDanny Mösch S7 s71 {1}; 124525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-1]]:8: warning: use designated initializer list to initialize 'S7' [modernize-use-designated-initializers] 125525fe449SDanny Mösch // CHECK-MESSAGES-SINGLE-ELEMENT: :[[@LINE-9]]:1: note: aggregate type is defined here 126525fe449SDanny Mösch // CHECK-FIXES-SINGLE-ELEMENT: S7 s71 {.u.k=1}; 127525fe449SDanny Mösch 128525fe449SDanny Mösch struct S8: S7 { int i; }; 129525fe449SDanny Mösch 130525fe449SDanny Mösch S8 s81{1, 2}; 131525fe449SDanny Mösch 132525fe449SDanny Mösch struct S9 { 133525fe449SDanny Mösch int i, j; 134525fe449SDanny Mösch S9 &operator=(S9); 135525fe449SDanny Mösch }; 136525fe449SDanny Mösch 137525fe449SDanny Mösch S9 s91{1, 2}; 138525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: use designated initializer list to initialize 'S9' [modernize-use-designated-initializers] 139525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here 140525fe449SDanny Mösch // CHECK-FIXES: S9 s91{.i=1, .j=2}; 141525fe449SDanny Mösch 142525fe449SDanny Mösch struct S10 { int i = 1, j = 2; }; 143525fe449SDanny Mösch 144525fe449SDanny Mösch S10 s101 {1, .j=2}; 145525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers] 146525fe449SDanny Mösch // CHECK-FIXES: S10 s101 {.i=1, .j=2}; 147525fe449SDanny Mösch 148525fe449SDanny Mösch struct S11 { int i; S10 s10; }; 149525fe449SDanny Mösch 150525fe449SDanny Mösch S11 s111 { .i = 1 }; 151525fe449SDanny Mösch S11 s112 { 1 }; 152525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S11' [modernize-use-designated-initializers] 153525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-5]]:1: note: aggregate type is defined here 154525fe449SDanny Mösch // CHECK-FIXES: S11 s112 { .i=1 }; 155525fe449SDanny Mösch 156525fe449SDanny Mösch S11 s113 { .i=1, {}}; 157525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use designated init expression to initialize field 's10' [modernize-use-designated-initializers] 158525fe449SDanny Mösch // CHECK-FIXES: S11 s113 { .i=1, .s10={}}; 159525fe449SDanny Mösch 160525fe449SDanny Mösch S11 s114 { .i=1, .s10={1, .j=2}}; 161525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:24: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers] 162525fe449SDanny Mösch // CHECK-FIXES: S11 s114 { .i=1, .s10={.i=1, .j=2}}; 163525fe449SDanny Mösch 164525fe449SDanny Mösch struct S12 { 165525fe449SDanny Mösch int i; 166525fe449SDanny Mösch struct { int j; }; 167525fe449SDanny Mösch }; 168525fe449SDanny Mösch 169525fe449SDanny Mösch S12 s121 {1, 2}; 170525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S12' [modernize-use-designated-initializers] 171525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-7]]:1: note: aggregate type is defined here 172525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S12' [modernize-use-designated-initializers] 173525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-9]]:1: note: aggregate type is defined here 174525fe449SDanny Mösch // CHECK-FIXES: S12 s121 {.i=1, .j=2}; 175525fe449SDanny Mösch 176525fe449SDanny Mösch struct S13 { 177525fe449SDanny Mösch union { 178525fe449SDanny Mösch int k; 179525fe449SDanny Mösch double d; 180525fe449SDanny Mösch }; 181525fe449SDanny Mösch int i; 182525fe449SDanny Mösch }; 183525fe449SDanny Mösch 184525fe449SDanny Mösch S13 s131 {1, 2}; 185525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use designated initializer list to initialize 'S13' [modernize-use-designated-initializers] 186525fe449SDanny Mösch // CHECK-MESSAGES: :[[@LINE-10]]:1: note: aggregate type is defined here 187525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-3]]:10: warning: use designated initializer list to initialize 'S13' [modernize-use-designated-initializers] 188525fe449SDanny Mösch // CHECK-MESSAGES-POD: :[[@LINE-12]]:1: note: aggregate type is defined here 189525fe449SDanny Mösch // CHECK-FIXES: S13 s131 {.k=1, .i=2}; 190525fe449SDanny Mösch 191525fe449SDanny Mösch #define A (3+2) 192525fe449SDanny Mösch #define B .j=1 193525fe449SDanny Mösch 194525fe449SDanny Mösch S9 s92 {A, B}; 195525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-1]]:9: warning: use designated init expression to initialize field 'i' [modernize-use-designated-initializers] 196525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-5]]:11: note: expanded from macro 'A' 197525fe449SDanny Mösch 198525fe449SDanny Mösch #define DECLARE_S93 S9 s93 {1, 2} 199525fe449SDanny Mösch 200525fe449SDanny Mösch DECLARE_S93; 201525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-1]]:1: warning: use designated initializer list to initialize 'S9' [modernize-use-designated-initializers] 202525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-4]]:28: note: expanded from macro 'DECLARE_S93' 203525fe449SDanny Mösch // CHECK-MESSAGES-MACROS: :[[@LINE-71]]:1: note: aggregate type is defined here 204*27ef549aSz1nke 205*27ef549aSz1nke // Issue #113652. 206*27ef549aSz1nke struct S14; 207*27ef549aSz1nke 208*27ef549aSz1nke struct S15{ 209*27ef549aSz1nke S15(S14& d):d{d}{} 210*27ef549aSz1nke S14& d; 211*27ef549aSz1nke }; 212