1*31f81399SArtem Dergachev // RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=core,debug.ExprInspection %s -verify
21bbd1439SJordan Rose 
362ac9ecaSJordan Rose void clang_analyzer_checkInlined(bool);
41bbd1439SJordan Rose void clang_analyzer_eval(int);
51bbd1439SJordan Rose 
61bbd1439SJordan Rose namespace EnumsViaMemberExpr {
71bbd1439SJordan Rose   struct Foo {
81bbd1439SJordan Rose     enum E {
91bbd1439SJordan Rose       Bar = 1
101bbd1439SJordan Rose     };
111bbd1439SJordan Rose   };
121bbd1439SJordan Rose 
testEnumVal(Foo Baz)131bbd1439SJordan Rose   void testEnumVal(Foo Baz) {
141bbd1439SJordan Rose     clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}}
151bbd1439SJordan Rose   }
161bbd1439SJordan Rose 
testEnumRef(Foo & Baz)171bbd1439SJordan Rose   void testEnumRef(Foo &Baz) {
181bbd1439SJordan Rose     clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}}
191bbd1439SJordan Rose   }
201bbd1439SJordan Rose 
testEnumPtr(Foo * Baz)211bbd1439SJordan Rose   void testEnumPtr(Foo *Baz) {
221bbd1439SJordan Rose     clang_analyzer_eval(Baz->Bar == Foo::Bar); // expected-warning{{TRUE}}
231bbd1439SJordan Rose   }
241bbd1439SJordan Rose }
2562ac9ecaSJordan Rose 
2662ac9ecaSJordan Rose namespace PR19531 {
2762ac9ecaSJordan Rose   struct A {
APR19531::A2862ac9ecaSJordan Rose     A() : x(0) {}
2962ac9ecaSJordan Rose     bool h() const;
3062ac9ecaSJordan Rose     int x;
3162ac9ecaSJordan Rose   };
3262ac9ecaSJordan Rose 
3362ac9ecaSJordan Rose   struct B {
gPR19531::B3462ac9ecaSJordan Rose     void g(bool (A::*mp_f)() const) {
3562ac9ecaSJordan Rose       // This used to trigger an assertion because the 'this' pointer is a
3662ac9ecaSJordan Rose       // temporary.
3762ac9ecaSJordan Rose       (A().*mp_f)();
3862ac9ecaSJordan Rose     }
fPR19531::B3962ac9ecaSJordan Rose     void f() { g(&A::h); }
4062ac9ecaSJordan Rose   };
4162ac9ecaSJordan Rose }
42