Files
clang-p2996/clang/test/Analysis/eval-predefined-exprs.cpp
Pratyush Das 99d63ccff0 Add type information to integral template argument if required.
Non-comprehensive list of cases:
 * Dumping template arguments;
 * Corresponding parameter contains a deduced type;
 * Template arguments are for a DeclRefExpr that hadMultipleCandidates()

Type information is added in the form of prefixes (u8, u, U, L),
suffixes (U, L, UL, LL, ULL) or explicit casts to printed integral template
argument, if MSVC codeview mode is disabled.

Differential revision: https://reviews.llvm.org/D77598
2021-05-12 19:00:08 +00:00

99 lines
3.9 KiB
C++

// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
//
// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify \
// RUN: -triple i386-pc-win32 -fms-compatibility -fms-extensions -DANALYZER_MS %s
template <typename T>
void clang_analyzer_dump(const T *);
void clang_analyzer_warnIfReached();
template <typename T, auto Value, typename U>
void func(U param) {
clang_analyzer_dump(__func__);
clang_analyzer_dump(__FUNCTION__);
clang_analyzer_dump(__PRETTY_FUNCTION__);
// expected-warning@-3 {{&Element{"func",0 S64b,char}}}
// expected-warning@-3 {{&Element{"func",0 S64b,char}}}
// expected-warning@-3 {{&Element{"void func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,char}}}
#ifdef ANALYZER_MS
clang_analyzer_dump(__FUNCDNAME__);
clang_analyzer_dump(L__FUNCTION__);
clang_analyzer_dump(__FUNCSIG__);
clang_analyzer_dump(L__FUNCSIG__);
// expected-warning@-4 {{&Element{"??$func@UClass@?1??foo@@YAXXZ@$0CK@D@@YAXD@Z",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"func",0 S64b,wchar_t}}}
// expected-warning@-4 {{&Element{"void __cdecl func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"void __cdecl func(U) [T = Class, Value = 42ULL, U = char]",0 S64b,wchar_t}}}
#endif
}
void foo() {
clang_analyzer_dump(__func__);
clang_analyzer_dump(__FUNCTION__);
clang_analyzer_dump(__PRETTY_FUNCTION__);
// expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
// expected-warning@-3 {{&Element{"foo",0 S64b,char}}}
// expected-warning@-3 {{&Element{"void foo()",0 S64b,char}}}
#ifdef ANALYZER_MS
clang_analyzer_dump(__FUNCDNAME__);
clang_analyzer_dump(L__FUNCTION__);
clang_analyzer_dump(__FUNCSIG__);
clang_analyzer_dump(L__FUNCSIG__);
// expected-warning@-4 {{&Element{"?foo@@YAXXZ",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"foo",0 S64b,wchar_t}}}
// expected-warning@-4 {{&Element{"void __cdecl foo(void)",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"void __cdecl foo(void)",0 S64b,wchar_t}}}
#endif
func<struct Class, 42ull>('b'); // instantiate template
}
struct A {
A() {
clang_analyzer_dump(__func__);
clang_analyzer_dump(__FUNCTION__);
clang_analyzer_dump(__PRETTY_FUNCTION__);
// expected-warning@-3 {{&Element{"A",0 S64b,char}}}
// expected-warning@-3 {{&Element{"A",0 S64b,char}}}
// expected-warning@-3 {{&Element{"A::A()",0 S64b,char}}}
#ifdef ANALYZER_MS
clang_analyzer_dump(__FUNCDNAME__);
clang_analyzer_dump(L__FUNCTION__);
clang_analyzer_dump(__FUNCSIG__);
clang_analyzer_dump(L__FUNCSIG__);
// expected-warning@-4 {{&Element{"??0A@@QAE@XZ",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"A",0 S64b,wchar_t}}}
// expected-warning@-4 {{&Element{"__thiscall A::A(void)",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"__thiscall A::A(void)",0 S64b,wchar_t}}}
#endif
}
~A() {
clang_analyzer_dump(__func__);
clang_analyzer_dump(__FUNCTION__);
clang_analyzer_dump(__PRETTY_FUNCTION__);
// expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
// expected-warning@-3 {{&Element{"~A",0 S64b,char}}}
// expected-warning@-3 {{&Element{"A::~A()",0 S64b,char}}}
#ifdef ANALYZER_MS
clang_analyzer_dump(__FUNCDNAME__);
clang_analyzer_dump(L__FUNCTION__);
clang_analyzer_dump(__FUNCSIG__);
clang_analyzer_dump(L__FUNCSIG__);
// expected-warning@-4 {{&Element{"??1A@@QAE@XZ",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"~A",0 S64b,wchar_t}}}
// expected-warning@-4 {{&Element{"__thiscall A::~A(void)",0 S64b,char}}}
// expected-warning@-4 {{&Element{L"__thiscall A::~A(void)",0 S64b,wchar_t}}}
#endif
}
template <typename> int dependent() {
// We should not analyze dependent functions.
// Such functions have no function name of predefined expressions such as: '__func__' etc.
clang_analyzer_warnIfReached(); // no-warning
}
};