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 template <typename T, auto Value, typename U>
func(U param)11 void func(U param) {
12   clang_analyzer_dump(__func__);
13   clang_analyzer_dump(__FUNCTION__);
14   clang_analyzer_dump(__PRETTY_FUNCTION__);
15   // expected-warning@-3 {{&Element{"func",0 S64b,char}}}
16   // expected-warning@-3 {{&Element{"func",0 S64b,char}}}
17   // expected-warning@-3 {{&Element{"void func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,char}}}
18 
19 #ifdef ANALYZER_MS
20   clang_analyzer_dump(__FUNCDNAME__);
21   clang_analyzer_dump(L__FUNCTION__);
22   clang_analyzer_dump(__FUNCSIG__);
23   clang_analyzer_dump(L__FUNCSIG__);
24   // expected-warning@-4 {{&Element{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
25   // expected-warning@-4 {{&Element{L"func",0 S64b,wchar_t}}}
26   // expected-warning@-4 {{&Element{"void __cdecl func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,char}}}
27   // expected-warning@-4 {{&Element{L"void __cdecl func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,wchar_t}}}
28 #endif
29 }
30 
foo()31 void foo() {
32   clang_analyzer_dump(__func__);
33   clang_analyzer_dump(__FUNCTION__);
34   clang_analyzer_dump(__PRETTY_FUNCTION__);
35   // expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
36   // expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
37   // expected-warning@-3 {{&Element{"void foo()",0 S64b,char}}}
38 
39 #ifdef ANALYZER_MS
40   clang_analyzer_dump(__FUNCDNAME__);
41   clang_analyzer_dump(L__FUNCTION__);
42   clang_analyzer_dump(__FUNCSIG__);
43   clang_analyzer_dump(L__FUNCSIG__);
44   // expected-warning@-4 {{&Element{"?foo@@YAXXZ",0 S64b,char}}}
45   // expected-warning@-4 {{&Element{L"foo",0 S64b,wchar_t}}}
46   // expected-warning@-4 {{&Element{"void __cdecl foo(void)",0 S64b,char}}}
47   // expected-warning@-4 {{&Element{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
48 #endif
49 
50   func<struct Class, 42ull>('b'); // instantiate template
51 }
52 
53 struct A {
AA54   A() {
55     clang_analyzer_dump(__func__);
56     clang_analyzer_dump(__FUNCTION__);
57     clang_analyzer_dump(__PRETTY_FUNCTION__);
58     // expected-warning@-3 {{&Element{"A",0 S64b,char}}}
59     // expected-warning@-3 {{&Element{"A",0 S64b,char}}}
60     // expected-warning@-3 {{&Element{"A::A()",0 S64b,char}}}
61 
62 #ifdef ANALYZER_MS
63     clang_analyzer_dump(__FUNCDNAME__);
64     clang_analyzer_dump(L__FUNCTION__);
65     clang_analyzer_dump(__FUNCSIG__);
66     clang_analyzer_dump(L__FUNCSIG__);
67     // expected-warning@-4 {{&Element{"??0A@@QAE@XZ",0 S64b,char}}}
68     // expected-warning@-4 {{&Element{L"A",0 S64b,wchar_t}}}
69     // expected-warning@-4 {{&Element{"__thiscall A::A(void)",0 S64b,char}}}
70     // expected-warning@-4 {{&Element{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
71 #endif
72   }
~AA73   ~A() {
74     clang_analyzer_dump(__func__);
75     clang_analyzer_dump(__FUNCTION__);
76     clang_analyzer_dump(__PRETTY_FUNCTION__);
77     // expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
78     // expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
79     // expected-warning@-3 {{&Element{"A::~A()",0 S64b,char}}}
80 
81 #ifdef ANALYZER_MS
82     clang_analyzer_dump(__FUNCDNAME__);
83     clang_analyzer_dump(L__FUNCTION__);
84     clang_analyzer_dump(__FUNCSIG__);
85     clang_analyzer_dump(L__FUNCSIG__);
86     // expected-warning@-4 {{&Element{"??1A@@QAE@XZ",0 S64b,char}}}
87     // expected-warning@-4 {{&Element{L"~A",0 S64b,wchar_t}}}
88     // expected-warning@-4 {{&Element{"__thiscall A::~A(void)",0 S64b,char}}}
89     // expected-warning@-4 {{&Element{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
90 #endif
91   }
92 
dependentA93   template <typename> int dependent() {
94     // We should not analyze dependent functions.
95     // Such functions have no function name of predefined expressions such as: '__func__' etc.
96     clang_analyzer_warnIfReached(); // no-warning
97   }
98 };
99