1*72d4d4e3SCongcong Cai // RUN: %check_clang_tidy %s bugprone-compare-pointer-to-member-virtual-function %t
2*72d4d4e3SCongcong Cai
3*72d4d4e3SCongcong Cai struct A {
4*72d4d4e3SCongcong Cai virtual ~A();
5*72d4d4e3SCongcong Cai void f1();
6*72d4d4e3SCongcong Cai void f2();
7*72d4d4e3SCongcong Cai virtual void f3();
8*72d4d4e3SCongcong Cai virtual void f4();
9*72d4d4e3SCongcong Cai
10*72d4d4e3SCongcong Cai void g1(int);
11*72d4d4e3SCongcong Cai };
12*72d4d4e3SCongcong Cai
13*72d4d4e3SCongcong Cai bool Result;
14*72d4d4e3SCongcong Cai
base()15*72d4d4e3SCongcong Cai void base() {
16*72d4d4e3SCongcong Cai Result = (&A::f1 == &A::f2);
17*72d4d4e3SCongcong Cai
18*72d4d4e3SCongcong Cai Result = (&A::f1 == &A::f3);
19*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
20*72d4d4e3SCongcong Cai
21*72d4d4e3SCongcong Cai Result = (&A::f1 != &A::f3);
22*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
23*72d4d4e3SCongcong Cai
24*72d4d4e3SCongcong Cai Result = (&A::f3 == nullptr);
25*72d4d4e3SCongcong Cai
26*72d4d4e3SCongcong Cai Result = (&A::f3 == &A::f4);
27*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
28*72d4d4e3SCongcong Cai
29*72d4d4e3SCongcong Cai void (A::*V1)() = &A::f3;
30*72d4d4e3SCongcong Cai Result = (V1 == &A::f1);
31*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
32*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :7:3: note: potential member virtual function is declared here.
33*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :8:3: note: potential member virtual function is declared here.
34*72d4d4e3SCongcong Cai Result = (&A::f1 == V1);
35*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
36*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :7:3: note: potential member virtual function is declared here.
37*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :8:3: note: potential member virtual function is declared here.
38*72d4d4e3SCongcong Cai
39*72d4d4e3SCongcong Cai auto& V2 = V1;
40*72d4d4e3SCongcong Cai Result = (&A::f1 == V2);
41*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
42*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :7:3: note: potential member virtual function is declared here.
43*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :8:3: note: potential member virtual function is declared here.
44*72d4d4e3SCongcong Cai
45*72d4d4e3SCongcong Cai void (A::*V3)(int) = &A::g1;
46*72d4d4e3SCongcong Cai Result = (V3 == &A::g1);
47*72d4d4e3SCongcong Cai Result = (&A::g1 == V3);
48*72d4d4e3SCongcong Cai }
49*72d4d4e3SCongcong Cai
50*72d4d4e3SCongcong Cai using B = A;
usingRecordName()51*72d4d4e3SCongcong Cai void usingRecordName() {
52*72d4d4e3SCongcong Cai Result = (&B::f1 == &B::f3);
53*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
54*72d4d4e3SCongcong Cai
55*72d4d4e3SCongcong Cai void (B::*V1)() = &B::f1;
56*72d4d4e3SCongcong Cai Result = (V1 == &B::f1);
57*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
58*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :7:3: note: potential member virtual function is declared here.
59*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :8:3: note: potential member virtual function is declared here.
60*72d4d4e3SCongcong Cai }
61*72d4d4e3SCongcong Cai
62*72d4d4e3SCongcong Cai typedef A C;
typedefRecordName()63*72d4d4e3SCongcong Cai void typedefRecordName() {
64*72d4d4e3SCongcong Cai Result = (&C::f1 == &C::f3);
65*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
66*72d4d4e3SCongcong Cai
67*72d4d4e3SCongcong Cai void (C::*V1)() = &C::f1;
68*72d4d4e3SCongcong Cai Result = (V1 == &C::f1);
69*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
70*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :7:3: note: potential member virtual function is declared here.
71*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :8:3: note: potential member virtual function is declared here.
72*72d4d4e3SCongcong Cai }
73*72d4d4e3SCongcong Cai
74*72d4d4e3SCongcong Cai struct A1 : public A {
75*72d4d4e3SCongcong Cai };
76*72d4d4e3SCongcong Cai
inheritClass()77*72d4d4e3SCongcong Cai void inheritClass() {
78*72d4d4e3SCongcong Cai Result = (&A1::f1 == &A1::f3);
79*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
80*72d4d4e3SCongcong Cai
81*72d4d4e3SCongcong Cai void (A1::*V1)() = &A1::f1;
82*72d4d4e3SCongcong Cai Result = (V1 == &A1::f1);
83*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: comparing a pointer to member virtual function with other pointer is unspecified behavior, only compare it with a null-pointer constant for equality.
84*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :7:3: note: potential member virtual function is declared here.
85*72d4d4e3SCongcong Cai // CHECK-MESSAGES: :8:3: note: potential member virtual function is declared here.
86*72d4d4e3SCongcong Cai }
87