forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s
 | 
						|
 | 
						|
typedef int __attribute__((ext_vector_type(2))) V;
 | 
						|
 | 
						|
void clang_analyzer_warnIfReached();
 | 
						|
void clang_analyzer_numTimesReached();
 | 
						|
void clang_analyzer_eval(int);
 | 
						|
 | 
						|
int flag;
 | 
						|
 | 
						|
V pass_through_and_set_flag(V v) {
 | 
						|
  flag = 1;
 | 
						|
  return v;
 | 
						|
}
 | 
						|
 | 
						|
V dont_crash_and_dont_split_state(V x, V y) {
 | 
						|
  flag = 0;
 | 
						|
  V z = x && pass_through_and_set_flag(y);
 | 
						|
  clang_analyzer_eval(flag); // expected-warning{{TRUE}}
 | 
						|
  // FIXME: For now we treat vector operator && as short-circuit,
 | 
						|
  // but in fact it is not. It should always evaluate
 | 
						|
  // pass_through_and_set_flag(). It should not split state.
 | 
						|
  // Now we also get FALSE on the other path.
 | 
						|
  // expected-warning@-5{{FALSE}}
 | 
						|
 | 
						|
  // FIXME: Should be 1 since we should not split state.
 | 
						|
  clang_analyzer_numTimesReached(); // expected-warning{{2}}
 | 
						|
  return z;
 | 
						|
}
 | 
						|
 | 
						|
void test_read() {
 | 
						|
  V x;
 | 
						|
  x[0] = 0;
 | 
						|
  x[1] = 1;
 | 
						|
 | 
						|
  clang_analyzer_eval(x[0] == 0); // expected-warning{{TRUE}}
 | 
						|
}
 | 
						|
 | 
						|
V return_vector() {
 | 
						|
  V z;
 | 
						|
  z[0] = 0;
 | 
						|
  z[1] = 0;
 | 
						|
  return z;
 | 
						|
}
 | 
						|
 | 
						|
int test_vector_access() {
 | 
						|
  return return_vector()[0]; // no-crash no-warning
 | 
						|
}
 | 
						|
 | 
						|
@interface I
 | 
						|
@property V v;
 | 
						|
@end
 | 
						|
 | 
						|
// Do not crash on subscript operations into ObjC properties.
 | 
						|
int myfunc(I *i2) {
 | 
						|
  int out = i2.v[0]; // no-crash no-warning
 | 
						|
 | 
						|
  // Check that the analysis continues.
 | 
						|
  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
 | 
						|
  return out;
 | 
						|
}
 |