Clang Project

clang_source_code/test/Analysis/bug_hash_test.cpp
1// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,debug.ExprInspection %s -verify
2
3constexpr int clang_analyzer_hashDump(int) { return 5; }
4
5void function(int) {
6  clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void function(int)$27$clang_analyzer_hashDump(5);$Category}}
7}
8
9namespace {
10void variadicParam(int, ...) {
11  clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void (anonymous namespace)::variadicParam(int, ...)$27$clang_analyzer_hashDump(5);$Category}}
12}
13} // namespace
14
15constexpr int f() {
16  return clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$int f()$34$returnclang_analyzer_hashDump(5);$Category}}
17}
18
19namespace AA {
20class X {
21  X() {
22    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$AA::X::X()$29$clang_analyzer_hashDump(5);$Category}}
23  }
24
25  static void static_method() {
26    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::static_method()$29$clang_analyzer_hashDump(5);$Category}}
27    variadicParam(5);
28  }
29
30  void method() && {
31    struct Y {
32      inline void method() const & {
33        clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::method()::Y::method() const &$33$clang_analyzer_hashDump(5);$Category}}
34      }
35    };
36
37    Y y;
38    y.method();
39
40    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::method() &&$29$clang_analyzer_hashDump(5);$Category}}
41  }
42
43  void OutOfLine();
44
45  X &operator=(int) {
46    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$class AA::X & AA::X::operator=(int)$29$clang_analyzer_hashDump(5);$Category}}
47    return *this;
48  }
49
50  operator int() {
51    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$AA::X::operator int()$29$clang_analyzer_hashDump(5);$Category}}
52    return 0;
53  }
54
55  explicit operator float() {
56    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$AA::X::operator float()$29$clang_analyzer_hashDump(5);$Category}}
57    return 0;
58  }
59};
60} // namespace AA
61
62void AA::X::OutOfLine() {
63  clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::OutOfLine()$27$clang_analyzer_hashDump(5);$Category}}
64}
65
66void testLambda() {
67  []() {
68    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void testLambda()::(anonymous class)::operator()() const$29$clang_analyzer_hashDump(5);$Category}}
69  }();
70}
71
72template <typename T>
73void f(T) {
74  clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void f(T)$27$clang_analyzer_hashDump(5);$Category}}
75}
76
77template <typename T>
78struct TX {
79  void f(T) {
80    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void TX::f(T)$29$clang_analyzer_hashDump(5);$Category}}
81  }
82};
83
84template <>
85void f<long>(long) {
86  clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void f(long)$27$clang_analyzer_hashDump(5);$Category}}
87}
88
89template <>
90struct TX<long> {
91  void f(long) {
92    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void TX<long>::f(long)$29$clang_analyzer_hashDump(5);$Category}}
93  }
94};
95
96template <typename T>
97struct TTX {
98  template<typename S>
99  void f(T, S) {
100    clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void TTX::f(T, S)$29$clang_analyzer_hashDump(5);$Category}}
101  }
102};
103
104void g() {
105  // TX<int> and TX<double> is instantiated from the same code with the same
106  // source locations. The same error happining in both of the instantiations
107  // should share the common hash. This means we should not include the
108  // template argument for these types in the function signature.
109  // Note that, we still want the hash to be different for explicit
110  // specializations.
111  TX<int> x;
112  TX<double> y;
113  TX<long> xl;
114  x.f(1);
115  xl.f(1);
116  f(5);
117  f(3.0);
118  y.f(2);
119  TTX<int> z;
120  z.f<int>(5, 5);
121  f(5l);
122}
123