42 lines
		
	
	
		
			869 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			869 B
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection %s -verify
 | 
						|
 | 
						|
void clang_analyzer_checkInlined(bool);
 | 
						|
void clang_analyzer_eval(int);
 | 
						|
 | 
						|
namespace EnumsViaMemberExpr {
 | 
						|
  struct Foo {
 | 
						|
    enum E {
 | 
						|
      Bar = 1
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  void testEnumVal(Foo Baz) {
 | 
						|
    clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}}
 | 
						|
  }
 | 
						|
 | 
						|
  void testEnumRef(Foo &Baz) {
 | 
						|
    clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}}
 | 
						|
  }
 | 
						|
 | 
						|
  void testEnumPtr(Foo *Baz) {
 | 
						|
    clang_analyzer_eval(Baz->Bar == Foo::Bar); // expected-warning{{TRUE}}
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
namespace PR19531 {
 | 
						|
  struct A {
 | 
						|
    A() : x(0) {}
 | 
						|
    bool h() const;
 | 
						|
    int x;
 | 
						|
  };
 | 
						|
 | 
						|
  struct B {
 | 
						|
    void g(bool (A::*mp_f)() const) {
 | 
						|
      // This used to trigger an assertion because the 'this' pointer is a
 | 
						|
      // temporary.
 | 
						|
      (A().*mp_f)();
 | 
						|
    }
 | 
						|
    void f() { g(&A::h); }
 | 
						|
  };
 | 
						|
}
 |