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