101 lines · cpp
1// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s2//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 %s5 6template <typename T>7void clang_analyzer_dump(const T *);8void clang_analyzer_warnIfReached();9 10template <typename T, auto Value, typename U>11void 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_MS20 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#endif29}30 31void 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_MS40 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#endif49 50 func<struct Class, 42ull>('b'); // instantiate template51}52 53struct A {54 A() {55 clang_analyzer_dump(__func__); // expected-warning {{&Element{"A",0 S64b,char}}}56#ifdef ANALYZER_MS57 clang_analyzer_dump(__FUNCTION__); // expected-warning {{&Element{"A::A",0 S64b,char}}}58#else59 clang_analyzer_dump(__FUNCTION__); // expected-warning {{&Element{"A",0 S64b,char}}}60#endif61 clang_analyzer_dump(__PRETTY_FUNCTION__); // expected-warning {{&Element{"A::A()",0 S64b,char}}}62 63#ifdef ANALYZER_MS64 clang_analyzer_dump(__FUNCDNAME__);65 clang_analyzer_dump(L__FUNCTION__);66 clang_analyzer_dump(__FUNCSIG__);67 clang_analyzer_dump(L__FUNCSIG__);68 // expected-warning@-4 {{&Element{"??0A@@QAE@XZ",0 S64b,char}}}69 // expected-warning@-4 {{&Element{L"A",0 S64b,wchar_t}}}70 // expected-warning@-4 {{&Element{"__thiscall A::A(void)",0 S64b,char}}}71 // expected-warning@-4 {{&Element{L"__thiscall A::A(void)",0 S64b,wchar_t}}}72#endif73 }74 ~A() {75 clang_analyzer_dump(__func__); // expected-warning {{&Element{"~A",0 S64b,char}}}76#ifdef ANALYZER_MS77 clang_analyzer_dump(__FUNCTION__); // expected-warning {{&Element{"A::~A",0 S64b,char}}}78#else79 clang_analyzer_dump(__FUNCTION__); // expected-warning {{&Element{"~A",0 S64b,char}}}80#endif81 clang_analyzer_dump(__PRETTY_FUNCTION__); // expected-warning {{&Element{"A::~A()",0 S64b,char}}}82 83#ifdef ANALYZER_MS84 clang_analyzer_dump(__FUNCDNAME__);85 clang_analyzer_dump(L__FUNCTION__);86 clang_analyzer_dump(__FUNCSIG__);87 clang_analyzer_dump(L__FUNCSIG__);88 // expected-warning@-4 {{&Element{"??1A@@QAE@XZ",0 S64b,char}}}89 // expected-warning@-4 {{&Element{L"~A",0 S64b,wchar_t}}}90 // expected-warning@-4 {{&Element{"__thiscall A::~A(void)",0 S64b,char}}}91 // expected-warning@-4 {{&Element{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}92#endif93 }94 95 template <typename> int dependent() {96 // We should not analyze dependent functions.97 // Such functions have no function name of predefined expressions such as: '__func__' etc.98 clang_analyzer_warnIfReached(); // no-warning99 }100};101