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> 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 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 { 54 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 } 73 ~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 93 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