// 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" };