File: eval-predefined-exprs.cpp

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-11
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,418,840 kB
  • sloc: cpp: 5,290,826; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,898; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,913; xml: 953; cs: 573; fortran: 539
file content (98 lines) | stat: -rw-r--r-- 3,979 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// 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
  }
};