1603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection %s -verify 2603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose 36bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid clang_analyzer_checkInlined(bool); 4603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rosevoid clang_analyzer_eval(int); 5603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose 6603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rosenamespace EnumsViaMemberExpr { 7603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose struct Foo { 8603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose enum E { 9603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose Bar = 1 10603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose }; 11603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose }; 12603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose 13603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose void testEnumVal(Foo Baz) { 14603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}} 15603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose } 16603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose 17603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose void testEnumRef(Foo &Baz) { 18603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}} 19603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose } 20603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose 21603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose void testEnumPtr(Foo *Baz) { 22603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose clang_analyzer_eval(Baz->Bar == Foo::Bar); // expected-warning{{TRUE}} 23603513d2294c437b37bcf47f326b686e31bd9e84Jordan Rose } 246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19531 { 276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct A { 286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines A() : x(0) {} 296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool h() const; 306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int x; 316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct B { 346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void g(bool (A::*mp_f)() const) { 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // This used to trigger an assertion because the 'this' pointer is a 366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // temporary. 376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (A().*mp_f)(); 386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void f() { g(&A::h); } 406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 42