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