1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2
3 struct X0 {
4 void f0();
5 void f1() const;
6 void f2() volatile;
7 void f3() const volatile;
8 };
9
test_object_cvquals(void (X0::* pm)(),void (X0::* pmc)()const,void (X0::* pmv)()volatile,void (X0::* pmcv)()const volatile,X0 * p,const X0 * pc,volatile X0 * pv,const volatile X0 * pcv,X0 & o,const X0 & oc,volatile X0 & ov,const volatile X0 & ocv)10 void 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