1 // RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
2 //
3 // RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify \
4 // RUN:   -triple i386-pc-win32 -fms-compatibility -fms-extensions -DANALYZER_MS %s
5 
6 template <typename T>
7 void clang_analyzer_dump(const T *);
8 void clang_analyzer_warnIfReached();
9 
10 void builtin_unique_stable_name_of_lambda() {
11   auto y = [] {};
12   clang_analyzer_dump(__builtin_unique_stable_name(y));
13   // expected-warning@-1 {{&Element{"_ZTSZ36builtin_unique_stable_name_of_lambdavEUlvE11_12",0 S64b,char}}}
14 }
15 
16 template <typename T, auto Value, typename U>
17 void func(U param) {
18   clang_analyzer_dump(__func__);
19   clang_analyzer_dump(__FUNCTION__);
20   clang_analyzer_dump(__PRETTY_FUNCTION__);
21   // expected-warning@-3 {{&Element{"func",0 S64b,char}}}
22   // expected-warning@-3 {{&Element{"func",0 S64b,char}}}
23   // expected-warning@-3 {{&Element{"void func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
24 
25 #ifdef ANALYZER_MS
26   clang_analyzer_dump(__FUNCDNAME__);
27   clang_analyzer_dump(L__FUNCTION__);
28   clang_analyzer_dump(__FUNCSIG__);
29   clang_analyzer_dump(L__FUNCSIG__);
30   // expected-warning@-4 {{&Element{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
31   // expected-warning@-4 {{&Element{L"func",0 S64b,wchar_t}}}
32   // expected-warning@-4 {{&Element{"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,char}}}
33   // expected-warning@-4 {{&Element{L"void __cdecl func(U) [T = Class, Value = 42, U = char]",0 S64b,wchar_t}}}
34 #endif
35 }
36 
37 void foo() {
38   clang_analyzer_dump(__func__);
39   clang_analyzer_dump(__FUNCTION__);
40   clang_analyzer_dump(__PRETTY_FUNCTION__);
41   // expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
42   // expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
43   // expected-warning@-3 {{&Element{"void foo()",0 S64b,char}}}
44 
45 #ifdef ANALYZER_MS
46   clang_analyzer_dump(__FUNCDNAME__);
47   clang_analyzer_dump(L__FUNCTION__);
48   clang_analyzer_dump(__FUNCSIG__);
49   clang_analyzer_dump(L__FUNCSIG__);
50   // expected-warning@-4 {{&Element{"?foo@@YAXXZ",0 S64b,char}}}
51   // expected-warning@-4 {{&Element{L"foo",0 S64b,wchar_t}}}
52   // expected-warning@-4 {{&Element{"void __cdecl foo(void)",0 S64b,char}}}
53   // expected-warning@-4 {{&Element{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
54 #endif
55 
56   func<struct Class, 42ull>('b'); // instantiate template
57 }
58 
59 void test_builtin_unique_stable_name(int a) {
60   clang_analyzer_dump(__builtin_unique_stable_name(a));
61   // expected-warning@-1 {{&Element{"_ZTSi",0 S64b,char}}}
62 }
63 
64 struct A {
65   A() {
66     clang_analyzer_dump(__func__);
67     clang_analyzer_dump(__FUNCTION__);
68     clang_analyzer_dump(__PRETTY_FUNCTION__);
69     // expected-warning@-3 {{&Element{"A",0 S64b,char}}}
70     // expected-warning@-3 {{&Element{"A",0 S64b,char}}}
71     // expected-warning@-3 {{&Element{"A::A()",0 S64b,char}}}
72 
73 #ifdef ANALYZER_MS
74     clang_analyzer_dump(__FUNCDNAME__);
75     clang_analyzer_dump(L__FUNCTION__);
76     clang_analyzer_dump(__FUNCSIG__);
77     clang_analyzer_dump(L__FUNCSIG__);
78     // expected-warning@-4 {{&Element{"??0A@@QAE@XZ",0 S64b,char}}}
79     // expected-warning@-4 {{&Element{L"A",0 S64b,wchar_t}}}
80     // expected-warning@-4 {{&Element{"__thiscall A::A(void)",0 S64b,char}}}
81     // expected-warning@-4 {{&Element{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
82 #endif
83   }
84   ~A() {
85     clang_analyzer_dump(__func__);
86     clang_analyzer_dump(__FUNCTION__);
87     clang_analyzer_dump(__PRETTY_FUNCTION__);
88     // expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
89     // expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
90     // expected-warning@-3 {{&Element{"A::~A()",0 S64b,char}}}
91 
92 #ifdef ANALYZER_MS
93     clang_analyzer_dump(__FUNCDNAME__);
94     clang_analyzer_dump(L__FUNCTION__);
95     clang_analyzer_dump(__FUNCSIG__);
96     clang_analyzer_dump(L__FUNCSIG__);
97     // expected-warning@-4 {{&Element{"??1A@@QAE@XZ",0 S64b,char}}}
98     // expected-warning@-4 {{&Element{L"~A",0 S64b,wchar_t}}}
99     // expected-warning@-4 {{&Element{"__thiscall A::~A(void)",0 S64b,char}}}
100     // expected-warning@-4 {{&Element{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
101 #endif
102   }
103 
104   template <typename> int dependent() {
105     // We should not analyze dependent functions.
106     // Such functions have no function name of predefined expressions such as: '__func__' etc.
107     clang_analyzer_warnIfReached(); // no-warning
108   }
109 };
110