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);
 | 
						|
}
 |