1 // RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,debug.ExprInspection %s -verify 2 3 constexpr int clang_analyzer_hashDump(int) { return 5; } 4 5 void function(int) { 6 clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void function(int)$27$clang_analyzer_hashDump(5);$Category}} 7 } 8 9 namespace { 10 void 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 15 constexpr int f() { 16 return clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$int f()$34$returnclang_analyzer_hashDump(5);$Category}} 17 } 18 19 namespace AA { 20 class 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 62 void AA::X::OutOfLine() { 63 clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::OutOfLine()$27$clang_analyzer_hashDump(5);$Category}} 64 } 65 66 void 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 72 template <typename T> 73 void f(T) { 74 clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void f(T)$27$clang_analyzer_hashDump(5);$Category}} 75 } 76 77 template <typename T> 78 struct 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 84 template <> 85 void f<long>(long) { 86 clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void f(long)$27$clang_analyzer_hashDump(5);$Category}} 87 } 88 89 template <> 90 struct 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 96 template <typename T> 97 struct 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 104 void 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