1878e5905SArthur Eubanks // RUN: %clang_cc1 %s -fsyntax-only -Wmicrosoft -verify -fms-extensions
2*2cb61a1dSTimm Bäder // RUN: %clang_cc1 %s -fsyntax-only -Wmicrosoft -verify -fms-extensions -fexperimental-new-constant-interpreter
3878e5905SArthur Eubanks
466c43fbdSRichard Dzenis using size_t = __SIZE_TYPE__;
566c43fbdSRichard Dzenis
666c43fbdSRichard Dzenis // Test array initialization
array_init()766c43fbdSRichard Dzenis void array_init() {
8878e5905SArthur Eubanks const char a[] = __FUNCTION__; // expected-warning{{initializing an array from a '__FUNCTION__' predefined identifier is a Microsoft extension}}
9878e5905SArthur Eubanks const char b[] = __FUNCDNAME__; // expected-warning{{initializing an array from a '__FUNCDNAME__' predefined identifier is a Microsoft extension}}
10878e5905SArthur Eubanks const char c[] = __FUNCSIG__; // expected-warning{{initializing an array from a '__FUNCSIG__' predefined identifier is a Microsoft extension}}
11878e5905SArthur Eubanks const char d[] = __func__; // expected-warning{{initializing an array from a '__func__' predefined identifier is a Microsoft extension}}
12878e5905SArthur Eubanks const char e[] = __PRETTY_FUNCTION__; // expected-warning{{initializing an array from a '__PRETTY_FUNCTION__' predefined identifier is a Microsoft extension}}
1366c43fbdSRichard Dzenis const wchar_t f[] = L__FUNCTION__; // expected-warning{{initializing an array from a 'L__FUNCTION__' predefined identifier is a Microsoft extension}}
1466c43fbdSRichard Dzenis const wchar_t g[] = L__FUNCSIG__; // expected-warning{{initializing an array from a 'L__FUNCSIG__' predefined identifier is a Microsoft extension}}
1566c43fbdSRichard Dzenis }
1666c43fbdSRichard Dzenis
1766c43fbdSRichard Dzenis // Test function local identifiers outside of a function
1866c43fbdSRichard Dzenis const char* g_function = __FUNCTION__; // expected-warning{{predefined identifier is only valid inside function}}
1966c43fbdSRichard Dzenis const char* g_function_lconcat = "" __FUNCTION__; // expected-warning{{predefined identifier is only valid inside function}} \
2066c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
2166c43fbdSRichard Dzenis const char* g_function_rconcat = __FUNCTION__ ""; // expected-warning{{predefined identifier is only valid inside function}} \
2266c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
2366c43fbdSRichard Dzenis
2466c43fbdSRichard Dzenis namespace NS
2566c43fbdSRichard Dzenis {
2666c43fbdSRichard Dzenis const char* function = __FUNCTION__; // expected-warning{{predefined identifier is only valid inside function}}
2766c43fbdSRichard Dzenis const char* function_lconcat = "" __FUNCTION__; // expected-warning{{predefined identifier is only valid inside function}} \
2866c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
2966c43fbdSRichard Dzenis const char* function_rconcat = __FUNCTION__ ""; // expected-warning{{predefined identifier is only valid inside function}} \
3066c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
3166c43fbdSRichard Dzenis
3266c43fbdSRichard Dzenis struct S
3366c43fbdSRichard Dzenis {
3466c43fbdSRichard Dzenis static constexpr const char* function = __FUNCTION__; // expected-warning{{predefined identifier is only valid inside function}}
3566c43fbdSRichard Dzenis static constexpr const char* function_lconcat = "" __FUNCTION__; // expected-warning{{predefined identifier is only valid inside function}} \
3666c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
3766c43fbdSRichard Dzenis static constexpr const char* function_rconcat = __FUNCTION__ ""; // expected-warning{{predefined identifier is only valid inside function}} \
3866c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
3966c43fbdSRichard Dzenis };
4066c43fbdSRichard Dzenis }
4166c43fbdSRichard Dzenis
4266c43fbdSRichard Dzenis template<class T, class U>
4366c43fbdSRichard Dzenis constexpr bool is_same = false;
4466c43fbdSRichard Dzenis template<class T>
4566c43fbdSRichard Dzenis constexpr bool is_same<T, T> = true;
4666c43fbdSRichard Dzenis
4766c43fbdSRichard Dzenis template<typename T, size_t N>
equal(const T (& a)[N],const T (& b)[N])4866c43fbdSRichard Dzenis constexpr bool equal(const T (&a)[N], const T (&b)[N]) {
4966c43fbdSRichard Dzenis for (size_t i = 0; i < N; i++)
5066c43fbdSRichard Dzenis if (a[i] != b[i])
5166c43fbdSRichard Dzenis return false;
5266c43fbdSRichard Dzenis return true;
5366c43fbdSRichard Dzenis }
5466c43fbdSRichard Dzenis
55182de296SDouglas Yung #define ASSERT_EQ(X, Y) static_assert(equal(X, Y), "")
56182de296SDouglas Yung #define ASSERT_EQ_TY(X, Y) static_assert(is_same<decltype((X)[0]), decltype((Y)[0])>, "")
5766c43fbdSRichard Dzenis
5866c43fbdSRichard Dzenis #define _WIDE(s) L##s
5966c43fbdSRichard Dzenis #define WIDE(s) _WIDE(s)
6066c43fbdSRichard Dzenis
6166c43fbdSRichard Dzenis // Test value
test_value()6266c43fbdSRichard Dzenis extern "C" void test_value() {
6366c43fbdSRichard Dzenis ASSERT_EQ(__FUNCTION__, "test_value");
6466c43fbdSRichard Dzenis ASSERT_EQ(__FUNCSIG__, "void __cdecl test_value(void)");
6566c43fbdSRichard Dzenis
6666c43fbdSRichard Dzenis ASSERT_EQ(WIDE(__FUNCTION__), L"test_value");
6766c43fbdSRichard Dzenis ASSERT_EQ(WIDE(__FUNCSIG__), L"void __cdecl test_value(void)");
6866c43fbdSRichard Dzenis }
6966c43fbdSRichard Dzenis
7066c43fbdSRichard Dzenis namespace PR13206 {
7166c43fbdSRichard Dzenis template<class T> class A {
7266c43fbdSRichard Dzenis public:
method()7366c43fbdSRichard Dzenis void method() {
7466c43fbdSRichard Dzenis ASSERT_EQ(L__FUNCTION__, L"method");
7566c43fbdSRichard Dzenis }
7666c43fbdSRichard Dzenis };
7766c43fbdSRichard Dzenis
test_template_value()7866c43fbdSRichard Dzenis void test_template_value() {
7966c43fbdSRichard Dzenis A<int> x;
8066c43fbdSRichard Dzenis x.method();
8166c43fbdSRichard Dzenis }
8266c43fbdSRichard Dzenis }
8366c43fbdSRichard Dzenis
8466c43fbdSRichard Dzenis // Test concatenation
test_concat()8566c43fbdSRichard Dzenis extern "C" void test_concat() {
8666c43fbdSRichard Dzenis ASSERT_EQ("left_" __FUNCTION__, "left_test_concat"); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
8766c43fbdSRichard Dzenis ASSERT_EQ("left_" __FUNCDNAME__, "left_test_concat"); // expected-warning{{expansion of predefined identifier '__FUNCDNAME__' to a string literal is a Microsoft extension}}
8866c43fbdSRichard Dzenis ASSERT_EQ("left " __FUNCSIG__, "left void __cdecl test_concat(void)"); // expected-warning{{expansion of predefined identifier '__FUNCSIG__' to a string literal is a Microsoft extension}}
8966c43fbdSRichard Dzenis
9066c43fbdSRichard Dzenis ASSERT_EQ(__FUNCTION__ "_right", "test_concat_right"); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
9166c43fbdSRichard Dzenis ASSERT_EQ(__FUNCDNAME__ "_right", "test_concat_right"); // expected-warning{{expansion of predefined identifier '__FUNCDNAME__' to a string literal is a Microsoft extension}}
9266c43fbdSRichard Dzenis ASSERT_EQ(__FUNCSIG__ " right", "void __cdecl test_concat(void) right"); // expected-warning{{expansion of predefined identifier '__FUNCSIG__' to a string literal is a Microsoft extension}}
9366c43fbdSRichard Dzenis
9466c43fbdSRichard Dzenis ASSERT_EQ("left_" __FUNCTION__ "_right", "left_test_concat_right"); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
9566c43fbdSRichard Dzenis ASSERT_EQ("left_" __FUNCDNAME__ "_right", "left_test_concat_right"); // expected-warning{{expansion of predefined identifier '__FUNCDNAME__' to a string literal is a Microsoft extension}}
9666c43fbdSRichard Dzenis ASSERT_EQ("left " __FUNCSIG__ " right", "left void __cdecl test_concat(void) right"); // expected-warning{{expansion of predefined identifier '__FUNCSIG__' to a string literal is a Microsoft extension}}
9766c43fbdSRichard Dzenis
9866c43fbdSRichard Dzenis ASSERT_EQ(__FUNCTION__ "/" __FUNCSIG__, "test_concat/void __cdecl test_concat(void)"); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}} \
9966c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier '__FUNCSIG__' to a string literal is a Microsoft extension}}
10066c43fbdSRichard Dzenis }
10166c43fbdSRichard Dzenis
test_wide_concat()10266c43fbdSRichard Dzenis extern "C" void test_wide_concat() {
10366c43fbdSRichard Dzenis // test L"" + ""
10466c43fbdSRichard Dzenis ASSERT_EQ(L"" __FUNCTION__, L__FUNCTION__); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
10566c43fbdSRichard Dzenis ASSERT_EQ(L"" __FUNCSIG__, L__FUNCSIG__); // expected-warning{{expansion of predefined identifier '__FUNCSIG__' to a string literal is a Microsoft extension}}
10666c43fbdSRichard Dzenis
10766c43fbdSRichard Dzenis // test Lx + ""
10866c43fbdSRichard Dzenis ASSERT_EQ(L__FUNCTION__, L__FUNCTION__ ""); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}}
10966c43fbdSRichard Dzenis ASSERT_EQ(L__FUNCSIG__, L__FUNCSIG__ ""); // expected-warning{{expansion of predefined identifier 'L__FUNCSIG__' to a string literal is a Microsoft extension}}
11066c43fbdSRichard Dzenis
11166c43fbdSRichard Dzenis ASSERT_EQ(L"left_" L__FUNCTION__, L"left_test_wide_concat"); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}}
11266c43fbdSRichard Dzenis ASSERT_EQ(L"left " L__FUNCSIG__, L"left void __cdecl test_wide_concat(void)"); // expected-warning{{expansion of predefined identifier 'L__FUNCSIG__' to a string literal is a Microsoft extension}}
11366c43fbdSRichard Dzenis
11466c43fbdSRichard Dzenis ASSERT_EQ(L__FUNCTION__ L"_right", L"test_wide_concat_right"); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}}
11566c43fbdSRichard Dzenis ASSERT_EQ(L__FUNCSIG__ L" right", L"void __cdecl test_wide_concat(void) right"); // expected-warning{{expansion of predefined identifier 'L__FUNCSIG__' to a string literal is a Microsoft extension}}
11666c43fbdSRichard Dzenis
11766c43fbdSRichard Dzenis ASSERT_EQ(L"left_" L__FUNCTION__ L"_right", L"left_test_wide_concat_right"); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}}
11866c43fbdSRichard Dzenis ASSERT_EQ(L"left " L__FUNCSIG__ L" right", L"left void __cdecl test_wide_concat(void) right"); // expected-warning{{expansion of predefined identifier 'L__FUNCSIG__' to a string literal is a Microsoft extension}}
11966c43fbdSRichard Dzenis
12066c43fbdSRichard Dzenis ASSERT_EQ(L__FUNCTION__ L"/" L__FUNCSIG__, L"test_wide_concat/void __cdecl test_wide_concat(void)"); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}} \
12166c43fbdSRichard Dzenis // expected-warning{{expansion of predefined identifier 'L__FUNCSIG__' to a string literal is a Microsoft extension}}
12266c43fbdSRichard Dzenis }
12366c43fbdSRichard Dzenis
test_encoding()12466c43fbdSRichard Dzenis void test_encoding() {
12566c43fbdSRichard Dzenis ASSERT_EQ_TY("" __FUNCTION__, ""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
12666c43fbdSRichard Dzenis ASSERT_EQ_TY(L"" __FUNCTION__, L""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
12766c43fbdSRichard Dzenis ASSERT_EQ_TY(L"" L__FUNCTION__, L""); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}}
12866c43fbdSRichard Dzenis ASSERT_EQ_TY("" L__FUNCTION__, L""); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}}
12966c43fbdSRichard Dzenis ASSERT_EQ_TY(u8"" __FUNCTION__, u8""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
13066c43fbdSRichard Dzenis ASSERT_EQ_TY(u"" __FUNCTION__, u""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
13166c43fbdSRichard Dzenis ASSERT_EQ_TY(U"" __FUNCTION__, U""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
13266c43fbdSRichard Dzenis //
13366c43fbdSRichard Dzenis ASSERT_EQ_TY(__FUNCTION__ L"", L""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
13466c43fbdSRichard Dzenis ASSERT_EQ_TY(__FUNCTION__ u8"", u8""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
13566c43fbdSRichard Dzenis ASSERT_EQ_TY(__FUNCTION__ u"", u""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
13666c43fbdSRichard Dzenis ASSERT_EQ_TY(__FUNCTION__ U"", U""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
13766c43fbdSRichard Dzenis }
13866c43fbdSRichard Dzenis
13966c43fbdSRichard Dzenis extern "C" void test_() {
14066c43fbdSRichard Dzenis ASSERT_EQ(U"" __FUNCTION__, U"test_"); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
14166c43fbdSRichard Dzenis ASSERT_EQ(u"" __FUNCTION__, u"test_"); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
14266c43fbdSRichard Dzenis ASSERT_EQ(u8"" __FUNCTION__, u8"test_"); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
14366c43fbdSRichard Dzenis }
14466c43fbdSRichard Dzenis
14566c43fbdSRichard Dzenis template<typename T>
14666c43fbdSRichard Dzenis void unused(T);
14766c43fbdSRichard Dzenis
test_invalid_encoding()14866c43fbdSRichard Dzenis void test_invalid_encoding() {
14966c43fbdSRichard Dzenis unused(u8"" L__FUNCTION__); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}} \
15066c43fbdSRichard Dzenis // expected-error{{unsupported non-standard concatenation of string literals}}
15166c43fbdSRichard Dzenis unused(u"" L__FUNCTION__); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}} \
15266c43fbdSRichard Dzenis // expected-error{{unsupported non-standard concatenation of string literals}}
15366c43fbdSRichard Dzenis unused(U"" L__FUNCTION__); // expected-warning{{expansion of predefined identifier 'L__FUNCTION__' to a string literal is a Microsoft extension}} \
15466c43fbdSRichard Dzenis // expected-error{{unsupported non-standard concatenation of string literals}}
15566c43fbdSRichard Dzenis }
15666c43fbdSRichard Dzenis
operator ""_len(const char *,size_t len)15766c43fbdSRichard Dzenis constexpr size_t operator""_len(const char*, size_t len) {
15866c43fbdSRichard Dzenis return len;
15966c43fbdSRichard Dzenis }
16066c43fbdSRichard Dzenis
test_udliteral()16166c43fbdSRichard Dzenis void test_udliteral() {
162182de296SDouglas Yung static_assert(__FUNCTION__ ""_len == 14, ""); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
16366c43fbdSRichard Dzenis }
16466c43fbdSRichard Dzenis
test_static_assert()16566c43fbdSRichard Dzenis void test_static_assert() {
16666c43fbdSRichard Dzenis static_assert(true, __FUNCTION__); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
16766c43fbdSRichard Dzenis }
16866c43fbdSRichard Dzenis
16966c43fbdSRichard Dzenis void test_char_injection(decltype(sizeof('"')), decltype(sizeof("()"))) {
17066c43fbdSRichard Dzenis unused("" __FUNCSIG__); // expected-warning{{expansion of predefined identifier '__FUNCSIG__' to a string literal is a Microsoft extension}}
171878e5905SArthur Eubanks }
172e6d305e6SRichard Dzenis
test_in_struct_init()173e6d305e6SRichard Dzenis void test_in_struct_init() {
174e6d305e6SRichard Dzenis struct {
175e6d305e6SRichard Dzenis char F[sizeof(__FUNCTION__)];
176e6d305e6SRichard Dzenis } s1 = { __FUNCTION__ }; // expected-warning{{initializing an array from a '__FUNCTION__' predefined identifier is a Microsoft extension}}
177e6d305e6SRichard Dzenis
178e6d305e6SRichard Dzenis struct {
179e6d305e6SRichard Dzenis char F[sizeof("F:" __FUNCTION__)]; // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
180e6d305e6SRichard Dzenis } s2 = { "F:" __FUNCTION__ }; // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
181e6d305e6SRichard Dzenis
182e6d305e6SRichard Dzenis class C {
183e6d305e6SRichard Dzenis public:
184e6d305e6SRichard Dzenis struct {
185e6d305e6SRichard Dzenis char F[sizeof(__FUNCTION__)];
186e6d305e6SRichard Dzenis } s;
187e6d305e6SRichard Dzenis } c1 = { { __FUNCTION__ } }; // expected-warning{{initializing an array from a '__FUNCTION__' predefined identifier is a Microsoft extension}}
188e6d305e6SRichard Dzenis }
189e6d305e6SRichard Dzenis
test_in_constexpr_struct_init()190e6d305e6SRichard Dzenis void test_in_constexpr_struct_init() {
191e6d305e6SRichard Dzenis struct {
192e6d305e6SRichard Dzenis char F[sizeof(__FUNCTION__)];
193e6d305e6SRichard Dzenis } constexpr s1 = { __FUNCTION__ }; // expected-warning{{initializing an array from a '__FUNCTION__' predefined identifier is a Microsoft extension}}
194e6d305e6SRichard Dzenis ASSERT_EQ(__FUNCTION__, s1.F);
195e6d305e6SRichard Dzenis
196e6d305e6SRichard Dzenis struct {
197e6d305e6SRichard Dzenis char F[sizeof("F:" __FUNCTION__)]; // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
198e6d305e6SRichard Dzenis } constexpr s2 = { "F:" __FUNCTION__ }; // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
199e6d305e6SRichard Dzenis ASSERT_EQ("F:" __FUNCTION__, s2.F); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
200e6d305e6SRichard Dzenis
201e6d305e6SRichard Dzenis class C {
202e6d305e6SRichard Dzenis public:
203e6d305e6SRichard Dzenis struct {
204e6d305e6SRichard Dzenis char F[sizeof("F:" __FUNCTION__)]; // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
205e6d305e6SRichard Dzenis } s;
206e6d305e6SRichard Dzenis } constexpr c1 = { { "F:" __FUNCTION__ } }; // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
207e6d305e6SRichard Dzenis ASSERT_EQ("F:" __FUNCTION__, c1.s.F); // expected-warning{{expansion of predefined identifier '__FUNCTION__' to a string literal is a Microsoft extension}}
208e6d305e6SRichard Dzenis }
209