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