xref: /aosp_15_r20/external/clang/test/Analysis/member-expr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection %s -verify
2*67e74705SXin Li 
3*67e74705SXin Li void clang_analyzer_checkInlined(bool);
4*67e74705SXin Li void clang_analyzer_eval(int);
5*67e74705SXin Li 
6*67e74705SXin Li namespace EnumsViaMemberExpr {
7*67e74705SXin Li   struct Foo {
8*67e74705SXin Li     enum E {
9*67e74705SXin Li       Bar = 1
10*67e74705SXin Li     };
11*67e74705SXin Li   };
12*67e74705SXin Li 
testEnumVal(Foo Baz)13*67e74705SXin Li   void testEnumVal(Foo Baz) {
14*67e74705SXin Li     clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}}
15*67e74705SXin Li   }
16*67e74705SXin Li 
testEnumRef(Foo & Baz)17*67e74705SXin Li   void testEnumRef(Foo &Baz) {
18*67e74705SXin Li     clang_analyzer_eval(Baz.Bar == Foo::Bar); // expected-warning{{TRUE}}
19*67e74705SXin Li   }
20*67e74705SXin Li 
testEnumPtr(Foo * Baz)21*67e74705SXin Li   void testEnumPtr(Foo *Baz) {
22*67e74705SXin Li     clang_analyzer_eval(Baz->Bar == Foo::Bar); // expected-warning{{TRUE}}
23*67e74705SXin Li   }
24*67e74705SXin Li }
25*67e74705SXin Li 
26*67e74705SXin Li namespace PR19531 {
27*67e74705SXin Li   struct A {
APR19531::A28*67e74705SXin Li     A() : x(0) {}
29*67e74705SXin Li     bool h() const;
30*67e74705SXin Li     int x;
31*67e74705SXin Li   };
32*67e74705SXin Li 
33*67e74705SXin Li   struct B {
gPR19531::B34*67e74705SXin Li     void g(bool (A::*mp_f)() const) {
35*67e74705SXin Li       // This used to trigger an assertion because the 'this' pointer is a
36*67e74705SXin Li       // temporary.
37*67e74705SXin Li       (A().*mp_f)();
38*67e74705SXin Li     }
fPR19531::B39*67e74705SXin Li     void f() { g(&A::h); }
40*67e74705SXin Li   };
41*67e74705SXin Li }
42