xref: /llvm-project/clang/test/Sema/ms_predefined_expr.cpp (revision 2cb61a1d117e2c20e3372bc23bf12b919feaaca2)
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