blob: c26b30d43da19e6853367d7fc2b96c729d7fefb9 [file] [log] [blame]
Douglas Gregor125fa402011-02-04 12:57:49 +00001// 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
Alp Toker6ed72512013-12-14 01:07:05 +000027 (pc->*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const' qualifier}}
Douglas Gregor125fa402011-02-04 12:57:49 +000028 (pc->*pmc)();
Alp Toker6ed72512013-12-14 01:07:05 +000029 (pc->*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
Douglas Gregor125fa402011-02-04 12:57:49 +000030 (pc->*pmcv)();
31
Alp Toker6ed72512013-12-14 01:07:05 +000032 (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}}
Douglas Gregor125fa402011-02-04 12:57:49 +000034 (pv->*pmv)();
35 (pv->*pmcv)();
36
Alp Toker6ed72512013-12-14 01:07:05 +000037 (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}}
Douglas Gregor125fa402011-02-04 12:57:49 +000040 (pcv->*pmcv)();
41
42 (o.*pm)();
43 (o.*pmc)();
44 (o.*pmv)();
45 (o.*pmcv)();
46
Alp Toker6ed72512013-12-14 01:07:05 +000047 (oc.*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const' qualifier}}
Douglas Gregor125fa402011-02-04 12:57:49 +000048 (oc.*pmc)();
Alp Toker6ed72512013-12-14 01:07:05 +000049 (oc.*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
Douglas Gregor125fa402011-02-04 12:57:49 +000050 (oc.*pmcv)();
51
Alp Toker6ed72512013-12-14 01:07:05 +000052 (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}}
Douglas Gregor125fa402011-02-04 12:57:49 +000054 (ov.*pmv)();
55 (ov.*pmcv)();
56
Alp Toker6ed72512013-12-14 01:07:05 +000057 (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}}
Douglas Gregor125fa402011-02-04 12:57:49 +000060 (ocv.*pmcv)();
61}