|  |  | 
|  | // RUN: %clang_cc1 -x c -Wstring-concatenation -fsyntax-only -verify %s | 
|  | // RUN: %clang_cc1 -x c++ -Wstring-concatenation -fsyntax-only -verify %s | 
|  |  | 
|  | const char *missing_comma[] = { | 
|  | "basic_filebuf", | 
|  | "basic_ios", | 
|  | "future", | 
|  | "optional", | 
|  | "packaged_task" // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | "promise",      // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  | "shared_future" | 
|  | }; | 
|  |  | 
|  | #ifndef __cplusplus | 
|  | typedef __WCHAR_TYPE__ wchar_t; | 
|  | #endif | 
|  |  | 
|  | const wchar_t *missing_comma_wchar[] = { | 
|  | L"basic_filebuf", | 
|  | L"packaged_task" // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | L"promise",      // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  | L"shared_future" | 
|  | }; | 
|  |  | 
|  | #if __cplusplus >= 201103L | 
|  | const char *missing_comma_u8[] = { | 
|  | u8"basic_filebuf", | 
|  | u8"packaged_task" // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | u8"promise",      // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  | u8"shared_future" | 
|  | }; | 
|  | #endif | 
|  |  | 
|  | const char *missing_comma_same_line[] = {"basic_filebuf", "basic_ios", | 
|  | "future" "optional",         // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | "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?}} | 
|  |  | 
|  | const char *missing_comma_different_lines[] = {"basic_filebuf", "basic_ios" // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | "future", "optional",        // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  | "packaged_task", "promise"}; | 
|  |  | 
|  | 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}} | 
|  | // expected-warning@-1{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  |  | 
|  | char missing_comma_inner[][5] = { | 
|  | "a", | 
|  | "b", | 
|  | "c" // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | "d" // expected-warning{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  | }; | 
|  |  | 
|  | const char *warn[] = { "cpll", "gpll", "hdmiphy" "usb480m" }; // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | // expected-warning@-1{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  |  | 
|  | const char *missing_two_commas_ignore[] = {"basic_filebuf", | 
|  | "basic_ios" | 
|  | "future" | 
|  | "optional", | 
|  | "packaged_task"}; | 
|  |  | 
|  | #define ONE(x) x | 
|  | #define TWO "foo" | 
|  | const char *macro_test[] = { ONE("foo"), | 
|  | TWO, | 
|  | "foo" TWO // expected-note{{place parentheses around the string literal to silence warning}} | 
|  | };          // expected-warning@-1{{suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma?}} | 
|  |  | 
|  | // Do not warn for macros. | 
|  |  | 
|  | #define BASIC_IOS "basic_ios" | 
|  | #define FUTURE "future" | 
|  | const char *macro_test2[] = {"basic_filebuf", BASIC_IOS | 
|  | FUTURE, "optional", | 
|  | "packaged_task", "promise"}; | 
|  |  | 
|  | #define FOO(xx) xx "_normal", \ | 
|  | xx "_movable", | 
|  |  | 
|  | const char *macro_test3[] = {"basic_filebuf", | 
|  | "basic_ios", | 
|  | FOO("future") | 
|  | "optional", | 
|  | "packaged_task"}; | 
|  |  | 
|  | #define BAR(name) #name "_normal" | 
|  |  | 
|  | const char *macro_test4[] = {"basic_filebuf", | 
|  | "basic_ios", | 
|  | BAR(future), | 
|  | "optional", | 
|  | "packaged_task"}; | 
|  |  | 
|  | #define SUPPRESS(x) x | 
|  | const char *macro_test5[] = { SUPPRESS("foo" "bar"), "baz" }; | 
|  |  | 
|  | typedef struct { | 
|  | int i; | 
|  | const char s[11]; | 
|  | } S; | 
|  |  | 
|  | S s = {1, "hello" "world"}; | 
|  |  | 
|  | const char *not_warn[] = { | 
|  | "hello" | 
|  | "world", "test" | 
|  | }; | 
|  |  | 
|  | const char *not_warn2[] = { | 
|  | "// Aaa\\\n"   " Bbb\\ \n"   " Ccc?" "?/\n", | 
|  | "// Aaa\\\r\n" " Bbb\\ \r\n" " Ccc?" "?/\r\n", | 
|  | "// Aaa\\\r"   " Bbb\\ \r"   " Ccc?" "?/\r" | 
|  | }; | 
|  |  | 
|  | const char *not_warn3[] = { | 
|  | "// \\tparam aaa Bbb\n", | 
|  | "// \\tparam\n" | 
|  | "//     aaa Bbb\n", | 
|  | "// \\tparam \n" | 
|  | "//     aaa Bbb\n", | 
|  | "// \\tparam aaa\n" | 
|  | "// Bbb\n" | 
|  | }; | 
|  |  | 
|  | const char *not_warn4[] =  {"title", | 
|  | "aaaa " | 
|  | "bbbb " | 
|  | "cccc " | 
|  | "ddd.", | 
|  | "url" | 
|  | }; | 
|  |  | 
|  | typedef struct { | 
|  | const char *a; | 
|  | const char *b; | 
|  | const char *c; | 
|  | } A; | 
|  |  | 
|  | const A not_warn5 = (A){"", | 
|  | "" | 
|  | "", | 
|  | ""}; | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | const A not_warn6 =  A{"", | 
|  | "" | 
|  | "", | 
|  | ""}; | 
|  | #endif | 
|  |  | 
|  | static A not_warn7 = {"", | 
|  |  | 
|  | "" | 
|  | "", | 
|  | ""}; | 
|  |  | 
|  |  | 
|  | // Do not warn when all the elements in the initializer are concatenated together. | 
|  | const char *all_elems_in_init_concatenated[] = {"a" "b" "c"}; | 
|  |  | 
|  | // Warning can be supressed also by extra parentheses. | 
|  | const char *extra_parens_to_suppress_warning[] = { | 
|  | "basic_filebuf", | 
|  | "basic_ios", | 
|  | "future", | 
|  | "optional", | 
|  | ("packaged_task" | 
|  | "promise"), | 
|  | "shared_future" | 
|  | }; |