p5.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
1// RUN: %clang_cc1 -fsyntax-only -verify %s
2
3struct X0 {
4  void f0();
5  void f1() const;
6  void f2() volatile;
7  void f3() const volatile;
8};
9
10void test_object_cvquals(void (X0::*pm)(),
11                         void (X0::*pmc)() const,
12                         void (X0::*pmv)() volatile,
13                         void (X0::*pmcv)() const volatile,
14                         X0 *p,
15                         const X0 *pc,
16                         volatile X0 *pv,
17                         const volatile X0 *pcv,
18                         X0 &o,
19                         const X0 &oc,
20                         volatile X0 &ov,
21                         const volatile X0 &ocv) {
22  (p->*pm)();
23  (p->*pmc)();
24  (p->*pmv)();
25  (p->*pmcv)();
26
27  (pc->*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const' qualifier}}
28  (pc->*pmc)();
29  (pc->*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
30  (pc->*pmcv)();
31
32  (pv->*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'volatile' qualifier}}
33  (pv->*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
34  (pv->*pmv)();
35  (pv->*pmcv)();
36
37  (pcv->*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const volatile' qualifiers}}
38  (pcv->*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
39  (pcv->*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
40  (pcv->*pmcv)();
41
42  (o.*pm)();
43  (o.*pmc)();
44  (o.*pmv)();
45  (o.*pmcv)();
46
47  (oc.*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const' qualifier}}
48  (oc.*pmc)();
49  (oc.*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
50  (oc.*pmcv)();
51
52  (ov.*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'volatile' qualifier}}
53  (ov.*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
54  (ov.*pmv)();
55  (ov.*pmcv)();
56
57  (ocv.*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const volatile' qualifiers}}
58  (ocv.*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
59  (ocv.*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
60  (ocv.*pmcv)();
61}
62