116386360SBalazs Benics // RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
216386360SBalazs Benics //
316386360SBalazs Benics // RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify \
416386360SBalazs Benics // RUN: -triple i386-pc-win32 -fms-compatibility -fms-extensions -DANALYZER_MS %s
516386360SBalazs Benics
616386360SBalazs Benics template <typename T>
716386360SBalazs Benics void clang_analyzer_dump(const T *);
816386360SBalazs Benics void clang_analyzer_warnIfReached();
916386360SBalazs Benics
1016386360SBalazs Benics template <typename T, auto Value, typename U>
func(U param)1116386360SBalazs Benics void func(U param) {
1216386360SBalazs Benics clang_analyzer_dump(__func__);
1316386360SBalazs Benics clang_analyzer_dump(__FUNCTION__);
1416386360SBalazs Benics clang_analyzer_dump(__PRETTY_FUNCTION__);
1516386360SBalazs Benics // expected-warning@-3 {{&Element{"func",0 S64b,char}}}
1616386360SBalazs Benics // expected-warning@-3 {{&Element{"func",0 S64b,char}}}
17*99d63ccfSPratyush Das // expected-warning@-3 {{&Element{"void func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,char}}}
1816386360SBalazs Benics
1916386360SBalazs Benics #ifdef ANALYZER_MS
2016386360SBalazs Benics clang_analyzer_dump(__FUNCDNAME__);
2116386360SBalazs Benics clang_analyzer_dump(L__FUNCTION__);
2216386360SBalazs Benics clang_analyzer_dump(__FUNCSIG__);
2316386360SBalazs Benics clang_analyzer_dump(L__FUNCSIG__);
2416386360SBalazs Benics // expected-warning@-4 {{&Element{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
2516386360SBalazs Benics // expected-warning@-4 {{&Element{L"func",0 S64b,wchar_t}}}
26*99d63ccfSPratyush Das // expected-warning@-4 {{&Element{"void __cdecl func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,char}}}
27*99d63ccfSPratyush Das // expected-warning@-4 {{&Element{L"void __cdecl func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,wchar_t}}}
2816386360SBalazs Benics #endif
2916386360SBalazs Benics }
3016386360SBalazs Benics
foo()3116386360SBalazs Benics void foo() {
3216386360SBalazs Benics clang_analyzer_dump(__func__);
3316386360SBalazs Benics clang_analyzer_dump(__FUNCTION__);
3416386360SBalazs Benics clang_analyzer_dump(__PRETTY_FUNCTION__);
3516386360SBalazs Benics // expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
3616386360SBalazs Benics // expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
3716386360SBalazs Benics // expected-warning@-3 {{&Element{"void foo()",0 S64b,char}}}
3816386360SBalazs Benics
3916386360SBalazs Benics #ifdef ANALYZER_MS
4016386360SBalazs Benics clang_analyzer_dump(__FUNCDNAME__);
4116386360SBalazs Benics clang_analyzer_dump(L__FUNCTION__);
4216386360SBalazs Benics clang_analyzer_dump(__FUNCSIG__);
4316386360SBalazs Benics clang_analyzer_dump(L__FUNCSIG__);
4416386360SBalazs Benics // expected-warning@-4 {{&Element{"?foo@@YAXXZ",0 S64b,char}}}
4516386360SBalazs Benics // expected-warning@-4 {{&Element{L"foo",0 S64b,wchar_t}}}
4616386360SBalazs Benics // expected-warning@-4 {{&Element{"void __cdecl foo(void)",0 S64b,char}}}
4716386360SBalazs Benics // expected-warning@-4 {{&Element{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
4816386360SBalazs Benics #endif
4916386360SBalazs Benics
5016386360SBalazs Benics func<struct Class, 42ull>('b'); // instantiate template
5116386360SBalazs Benics }
5216386360SBalazs Benics
5316386360SBalazs Benics struct A {
AA5416386360SBalazs Benics A() {
5516386360SBalazs Benics clang_analyzer_dump(__func__);
5616386360SBalazs Benics clang_analyzer_dump(__FUNCTION__);
5716386360SBalazs Benics clang_analyzer_dump(__PRETTY_FUNCTION__);
5816386360SBalazs Benics // expected-warning@-3 {{&Element{"A",0 S64b,char}}}
5916386360SBalazs Benics // expected-warning@-3 {{&Element{"A",0 S64b,char}}}
6016386360SBalazs Benics // expected-warning@-3 {{&Element{"A::A()",0 S64b,char}}}
6116386360SBalazs Benics
6216386360SBalazs Benics #ifdef ANALYZER_MS
6316386360SBalazs Benics clang_analyzer_dump(__FUNCDNAME__);
6416386360SBalazs Benics clang_analyzer_dump(L__FUNCTION__);
6516386360SBalazs Benics clang_analyzer_dump(__FUNCSIG__);
6616386360SBalazs Benics clang_analyzer_dump(L__FUNCSIG__);
6716386360SBalazs Benics // expected-warning@-4 {{&Element{"??0A@@QAE@XZ",0 S64b,char}}}
6816386360SBalazs Benics // expected-warning@-4 {{&Element{L"A",0 S64b,wchar_t}}}
6916386360SBalazs Benics // expected-warning@-4 {{&Element{"__thiscall A::A(void)",0 S64b,char}}}
7016386360SBalazs Benics // expected-warning@-4 {{&Element{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
7116386360SBalazs Benics #endif
7216386360SBalazs Benics }
~AA7316386360SBalazs Benics ~A() {
7416386360SBalazs Benics clang_analyzer_dump(__func__);
7516386360SBalazs Benics clang_analyzer_dump(__FUNCTION__);
7616386360SBalazs Benics clang_analyzer_dump(__PRETTY_FUNCTION__);
7716386360SBalazs Benics // expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
7816386360SBalazs Benics // expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
7916386360SBalazs Benics // expected-warning@-3 {{&Element{"A::~A()",0 S64b,char}}}
8016386360SBalazs Benics
8116386360SBalazs Benics #ifdef ANALYZER_MS
8216386360SBalazs Benics clang_analyzer_dump(__FUNCDNAME__);
8316386360SBalazs Benics clang_analyzer_dump(L__FUNCTION__);
8416386360SBalazs Benics clang_analyzer_dump(__FUNCSIG__);
8516386360SBalazs Benics clang_analyzer_dump(L__FUNCSIG__);
8616386360SBalazs Benics // expected-warning@-4 {{&Element{"??1A@@QAE@XZ",0 S64b,char}}}
8716386360SBalazs Benics // expected-warning@-4 {{&Element{L"~A",0 S64b,wchar_t}}}
8816386360SBalazs Benics // expected-warning@-4 {{&Element{"__thiscall A::~A(void)",0 S64b,char}}}
8916386360SBalazs Benics // expected-warning@-4 {{&Element{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
9016386360SBalazs Benics #endif
9116386360SBalazs Benics }
9216386360SBalazs Benics
dependentA9316386360SBalazs Benics template <typename> int dependent() {
9416386360SBalazs Benics // We should not analyze dependent functions.
9516386360SBalazs Benics // Such functions have no function name of predefined expressions such as: '__func__' etc.
9616386360SBalazs Benics clang_analyzer_warnIfReached(); // no-warning
9716386360SBalazs Benics }
9816386360SBalazs Benics };
99