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