xref: /llvm-project/clang/test/Sema/string-concat.c (revision 2f7adf5ee37934ee5769276644fcafbc9d4dcda3)
1dc096a66SDávid Bolvanský 
2b2c9b631SDávid Bolvanský // RUN: %clang_cc1 -x c -Wstring-concatenation -fsyntax-only -verify %s
3b2c9b631SDávid Bolvanský // RUN: %clang_cc1 -x c++ -Wstring-concatenation -fsyntax-only -verify %s
4dc096a66SDávid Bolvanský 
5dc096a66SDávid Bolvanský const char *missing_comma[] = {
6dc096a66SDávid Bolvanský     "basic_filebuf",
7dc096a66SDávid Bolvanský     "basic_ios",
8dc096a66SDávid Bolvanský     "future",
9dc096a66SDávid Bolvanský     "optional",
10dc096a66SDávid Bolvanský     "packaged_task" // expected-note{{place parentheses around the string literal to silence warning}}
11dc096a66SDávid Bolvanský     "promise",      // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
12dc096a66SDávid Bolvanský     "shared_future"
13dc096a66SDávid Bolvanský };
14dc096a66SDávid Bolvanský 
15dc096a66SDávid Bolvanský #ifndef __cplusplus
16dc096a66SDávid Bolvanský typedef __WCHAR_TYPE__ wchar_t;
17dc096a66SDávid Bolvanský #endif
18dc096a66SDávid Bolvanský 
19dc096a66SDávid Bolvanský const wchar_t *missing_comma_wchar[] = {
20dc096a66SDávid Bolvanský     L"basic_filebuf",
21dc096a66SDávid Bolvanský     L"packaged_task" // expected-note{{place parentheses around the string literal to silence warning}}
2204a23f1fSDávid Bolvanský     L"promise",      // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
2304a23f1fSDávid Bolvanský     L"shared_future"
24dc096a66SDávid Bolvanský };
25dc096a66SDávid Bolvanský 
266cd23558SDávid Bolvanský #if __cplusplus >= 201103L
27dc096a66SDávid Bolvanský const char *missing_comma_u8[] = {
28dc096a66SDávid Bolvanský     u8"basic_filebuf",
29dc096a66SDávid Bolvanský     u8"packaged_task" // expected-note{{place parentheses around the string literal to silence warning}}
3004a23f1fSDávid Bolvanský     u8"promise",      // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
3104a23f1fSDávid Bolvanský     u8"shared_future"
32dc096a66SDávid Bolvanský };
336cd23558SDávid Bolvanský #endif
34dc096a66SDávid Bolvanský 
35dc096a66SDávid Bolvanský const char *missing_comma_same_line[] = {"basic_filebuf", "basic_ios",
36dc096a66SDávid Bolvanský                        "future" "optional",         // expected-note{{place parentheses around the string literal to silence warning}}
37dc096a66SDávid Bolvanský                        "packaged_task", "promise"}; // expected-warning@-1{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
38dc096a66SDávid Bolvanský 
39dc096a66SDávid Bolvanský const char *missing_comma_different_lines[] = {"basic_filebuf", "basic_ios" // expected-note{{place parentheses around the string literal to silence warning}}
40dc096a66SDávid Bolvanský                        "future", "optional",        // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
41dc096a66SDávid Bolvanský                        "packaged_task", "promise"};
42dc096a66SDávid Bolvanský 
43dc096a66SDávid Bolvanský const char *missing_comma_same_line_all_literals[] = {"basic_filebuf", "future" "optional", "packaged_task"}; // expected-note{{place parentheses around the string literal to silence warning}}
44dc096a66SDávid Bolvanský                                                                                // expected-warning@-1{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
45dc096a66SDávid Bolvanský 
4604a23f1fSDávid Bolvanský char missing_comma_inner[][5] = {
47dc096a66SDávid Bolvanský     "a",
4804a23f1fSDávid Bolvanský     "b",
4904a23f1fSDávid Bolvanský     "c" // expected-note{{place parentheses around the string literal to silence warning}}
5004a23f1fSDávid Bolvanský     "d" // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
51dc096a66SDávid Bolvanský };
52dc096a66SDávid Bolvanský 
534b59dc77SDávid Bolvanský const char *warn[] = { "cpll", "gpll", "hdmiphy" "usb480m" }; // expected-note{{place parentheses around the string literal to silence warning}}
544b59dc77SDávid Bolvanský // expected-warning@-1{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
554b59dc77SDávid Bolvanský 
564b59dc77SDávid Bolvanský const char *missing_two_commas_ignore[] = {"basic_filebuf",
574b59dc77SDávid Bolvanský                        "basic_ios"
584b59dc77SDávid Bolvanský                        "future"
594b59dc77SDávid Bolvanský                        "optional",
604b59dc77SDávid Bolvanský                        "packaged_task"};
61dc096a66SDávid Bolvanský 
62dc096a66SDávid Bolvanský #define ONE(x) x
63dc096a66SDávid Bolvanský #define TWO "foo"
644b59dc77SDávid Bolvanský const char *macro_test[] = { ONE("foo"),
654b59dc77SDávid Bolvanský                              TWO,
664b59dc77SDávid Bolvanský                              "foo" TWO // expected-note{{place parentheses around the string literal to silence warning}}
67dc096a66SDávid Bolvanský                            };          // expected-warning@-1{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}}
68dc096a66SDávid Bolvanský 
69dc096a66SDávid Bolvanský // Do not warn for macros.
70dc096a66SDávid Bolvanský 
71dc096a66SDávid Bolvanský #define BASIC_IOS "basic_ios"
72dc096a66SDávid Bolvanský #define FUTURE "future"
73dc096a66SDávid Bolvanský const char *macro_test2[] = {"basic_filebuf", BASIC_IOS
74dc096a66SDávid Bolvanský                         FUTURE, "optional",
75dc096a66SDávid Bolvanský                        "packaged_task", "promise"};
76dc096a66SDávid Bolvanský 
77dc096a66SDávid Bolvanský #define FOO(xx) xx "_normal", \
78dc096a66SDávid Bolvanský                 xx "_movable",
79dc096a66SDávid Bolvanský 
80dc096a66SDávid Bolvanský const char *macro_test3[] = {"basic_filebuf",
81dc096a66SDávid Bolvanský                        "basic_ios",
82dc096a66SDávid Bolvanský                        FOO("future")
83dc096a66SDávid Bolvanský                        "optional",
84dc096a66SDávid Bolvanský                        "packaged_task"};
85dc096a66SDávid Bolvanský 
86dc096a66SDávid Bolvanský #define BAR(name) #name "_normal"
87dc096a66SDávid Bolvanský 
88dc096a66SDávid Bolvanský const char *macro_test4[] = {"basic_filebuf",
89dc096a66SDávid Bolvanský                        "basic_ios",
90dc096a66SDávid Bolvanský                        BAR(future),
91dc096a66SDávid Bolvanský                        "optional",
92dc096a66SDávid Bolvanský                        "packaged_task"};
93dc096a66SDávid Bolvanský 
94dc096a66SDávid Bolvanský #define SUPPRESS(x) x
95dc096a66SDávid Bolvanský const char *macro_test5[] = { SUPPRESS("foo" "bar"), "baz" };
96dc096a66SDávid Bolvanský 
9704a23f1fSDávid Bolvanský typedef struct {
9804a23f1fSDávid Bolvanský     int i;
9904a23f1fSDávid Bolvanský     const char s[11];
10004a23f1fSDávid Bolvanský } S;
10104a23f1fSDávid Bolvanský 
10204a23f1fSDávid Bolvanský S s = {1, "hello" "world"};
10304a23f1fSDávid Bolvanský 
10404a23f1fSDávid Bolvanský const char *not_warn[] = {
10504a23f1fSDávid Bolvanský     "hello"
10604a23f1fSDávid Bolvanský     "world", "test"
10704a23f1fSDávid Bolvanský };
10804a23f1fSDávid Bolvanský 
109975467e4SDávid Bolvanský const char *not_warn2[] = {
110975467e4SDávid Bolvanský     "// Aaa\\\n"   " Bbb\\ \n"   " Ccc?" "?/\n",
111975467e4SDávid Bolvanský     "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n",
112975467e4SDávid Bolvanský     "// Aaa\\\r"   " Bbb\\ \r"   " Ccc?" "?/\r"
113975467e4SDávid Bolvanský };
11462223ff1SDávid Bolvanský 
1154b59dc77SDávid Bolvanský const char *not_warn3[] = {
1164b59dc77SDávid Bolvanský   "// \\tparam aaa Bbb\n",
1174b59dc77SDávid Bolvanský   "// \\tparam\n"
1184b59dc77SDávid Bolvanský   "//     aaa Bbb\n",
1194b59dc77SDávid Bolvanský   "// \\tparam \n"
1204b59dc77SDávid Bolvanský   "//     aaa Bbb\n",
1214b59dc77SDávid Bolvanský   "// \\tparam aaa\n"
1224b59dc77SDávid Bolvanský   "// Bbb\n"
1234b59dc77SDávid Bolvanský };
1244b59dc77SDávid Bolvanský 
1254b59dc77SDávid Bolvanský const char *not_warn4[] =  {"title",
1264b59dc77SDávid Bolvanský                "aaaa "
1274b59dc77SDávid Bolvanský                "bbbb "
1284b59dc77SDávid Bolvanský                "cccc "
1294b59dc77SDávid Bolvanský                "ddd.",
1304b59dc77SDávid Bolvanský                "url"
1314b59dc77SDávid Bolvanský };
1324b59dc77SDávid Bolvanský 
133b9af72bfSDávid Bolvanský typedef struct {
134b9af72bfSDávid Bolvanský   const char *a;
135b9af72bfSDávid Bolvanský   const char *b;
136b9af72bfSDávid Bolvanský   const char *c;
137b9af72bfSDávid Bolvanský } A;
138b9af72bfSDávid Bolvanský 
139b9af72bfSDávid Bolvanský const A not_warn5 = (A){"",
140b9af72bfSDávid Bolvanský                         ""
141b9af72bfSDávid Bolvanský                         "",
142b9af72bfSDávid Bolvanský                         ""};
143b9af72bfSDávid Bolvanský 
144b9af72bfSDávid Bolvanský #ifdef __cplusplus
145b9af72bfSDávid Bolvanský const A not_warn6 =  A{"",
146b9af72bfSDávid Bolvanský                       ""
147b9af72bfSDávid Bolvanský                       "",
148b9af72bfSDávid Bolvanský                       ""};
149b9af72bfSDávid Bolvanský #endif
150b9af72bfSDávid Bolvanský 
151*2f7adf5eSDávid Bolvanský static A not_warn7 = {"",
152*2f7adf5eSDávid Bolvanský 
153*2f7adf5eSDávid Bolvanský   ""
154*2f7adf5eSDávid Bolvanský   "",
155*2f7adf5eSDávid Bolvanský   ""};
156*2f7adf5eSDávid Bolvanský 
157b9af72bfSDávid Bolvanský 
158dc096a66SDávid Bolvanský // Do not warn when all the elements in the initializer are concatenated together.
159dc096a66SDávid Bolvanský const char *all_elems_in_init_concatenated[] = {"a" "b" "c"};
160dc096a66SDávid Bolvanský 
161dc096a66SDávid Bolvanský // Warning can be supressed also by extra parentheses.
162dc096a66SDávid Bolvanský const char *extra_parens_to_suppress_warning[] = {
163dc096a66SDávid Bolvanský     "basic_filebuf",
164dc096a66SDávid Bolvanský     "basic_ios",
165dc096a66SDávid Bolvanský     "future",
166dc096a66SDávid Bolvanský     "optional",
167dc096a66SDávid Bolvanský     ("packaged_task"
168dc096a66SDávid Bolvanský     "promise"),
169dc096a66SDávid Bolvanský     "shared_future"
170dc096a66SDávid Bolvanský };
171