forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,debug.ExprInspection %s -verify
 | |
| 
 | |
| constexpr int clang_analyzer_hashDump(int) { return 5; }
 | |
| 
 | |
| void function(int) {
 | |
|   clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void function(int)$27$clang_analyzer_hashDump(5);$Category}}
 | |
| }
 | |
| 
 | |
| namespace {
 | |
| void variadicParam(int, ...) {
 | |
|   clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void (anonymous namespace)::variadicParam(int, ...)$27$clang_analyzer_hashDump(5);$Category}}
 | |
| }
 | |
| } // namespace
 | |
| 
 | |
| constexpr int f() {
 | |
|   return clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$int f()$34$returnclang_analyzer_hashDump(5);$Category}}
 | |
| }
 | |
| 
 | |
| namespace AA {
 | |
| class X {
 | |
|   X() {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$AA::X::X()$29$clang_analyzer_hashDump(5);$Category}}
 | |
|   }
 | |
| 
 | |
|   static void static_method() {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::static_method()$29$clang_analyzer_hashDump(5);$Category}}
 | |
|     variadicParam(5);
 | |
|   }
 | |
| 
 | |
|   void method() && {
 | |
|     struct Y {
 | |
|       inline void method() const & {
 | |
|         clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::method()::Y::method() const &$33$clang_analyzer_hashDump(5);$Category}}
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     Y y;
 | |
|     y.method();
 | |
| 
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::method() &&$29$clang_analyzer_hashDump(5);$Category}}
 | |
|   }
 | |
| 
 | |
|   void OutOfLine();
 | |
| 
 | |
|   X &operator=(int) {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$class AA::X & AA::X::operator=(int)$29$clang_analyzer_hashDump(5);$Category}}
 | |
|     return *this;
 | |
|   }
 | |
| 
 | |
|   operator int() {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$AA::X::operator int()$29$clang_analyzer_hashDump(5);$Category}}
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   explicit operator float() {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$AA::X::operator float()$29$clang_analyzer_hashDump(5);$Category}}
 | |
|     return 0;
 | |
|   }
 | |
| };
 | |
| } // namespace AA
 | |
| 
 | |
| void AA::X::OutOfLine() {
 | |
|   clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void AA::X::OutOfLine()$27$clang_analyzer_hashDump(5);$Category}}
 | |
| }
 | |
| 
 | |
| void testLambda() {
 | |
|   []() {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void testLambda()::(anonymous class)::operator()() const$29$clang_analyzer_hashDump(5);$Category}}
 | |
|   }();
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| void f(T) {
 | |
|   clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void f(T)$27$clang_analyzer_hashDump(5);$Category}}
 | |
| }
 | |
| 
 | |
| template <typename T>
 | |
| struct TX {
 | |
|   void f(T) {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void TX::f(T)$29$clang_analyzer_hashDump(5);$Category}}
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <>
 | |
| void f<long>(long) {
 | |
|   clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void f(long)$27$clang_analyzer_hashDump(5);$Category}}
 | |
| }
 | |
| 
 | |
| template <>
 | |
| struct TX<long> {
 | |
|   void f(long) {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void TX<long>::f(long)$29$clang_analyzer_hashDump(5);$Category}}
 | |
|   }
 | |
| };
 | |
| 
 | |
| template <typename T>
 | |
| struct TTX {
 | |
|   template<typename S>
 | |
|   void f(T, S) {
 | |
|     clang_analyzer_hashDump(5); // expected-warning {{debug.ExprInspection$void TTX::f(T, S)$29$clang_analyzer_hashDump(5);$Category}}
 | |
|   }
 | |
| };
 | |
| 
 | |
| void g() {
 | |
|   // TX<int> and TX<double> is instantiated from the same code with the same
 | |
|   // source locations. The same error happining in both of the instantiations
 | |
|   // should share the common hash. This means we should not include the
 | |
|   // template argument for these types in the function signature.
 | |
|   // Note that, we still want the hash to be different for explicit
 | |
|   // specializations.
 | |
|   TX<int> x;
 | |
|   TX<double> y;
 | |
|   TX<long> xl;
 | |
|   x.f(1);
 | |
|   xl.f(1);
 | |
|   f(5);
 | |
|   f(3.0);
 | |
|   y.f(2);
 | |
|   TTX<int> z;
 | |
|   z.f<int>(5, 5);
 | |
|   f(5l);
 | |
| }
 |