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 | |
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 | |