1fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
2fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
3fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregorstruct X0 {
4fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  void f0();
5fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  void f1() const;
6fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  void f2() volatile;
7fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  void f3() const volatile;
8fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor};
9fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
10fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregorvoid test_object_cvquals(void (X0::*pm)(),
11fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         void (X0::*pmc)() const,
12fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         void (X0::*pmv)() volatile,
13fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         void (X0::*pmcv)() const volatile,
14fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         X0 *p,
15fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         const X0 *pc,
16fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         volatile X0 *pv,
17fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         const volatile X0 *pcv,
18fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         X0 &o,
19fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         const X0 &oc,
20fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         volatile X0 &ov,
21fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor                         const volatile X0 &ocv) {
22fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (p->*pm)();
23fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (p->*pmc)();
24fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (p->*pmv)();
25fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (p->*pmcv)();
26fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (pc->*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const' qualifier}}
28fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (pc->*pmc)();
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (pc->*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
30fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (pc->*pmcv)();
31fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (pv->*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'volatile' qualifier}}
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (pv->*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
34fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (pv->*pmv)();
35fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (pv->*pmcv)();
36fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (pcv->*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const volatile' qualifiers}}
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (pcv->*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (pcv->*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
40fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (pcv->*pmcv)();
41fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
42fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (o.*pm)();
43fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (o.*pmc)();
44fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (o.*pmv)();
45fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (o.*pmcv)();
46fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (oc.*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const' qualifier}}
48fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (oc.*pmc)();
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (oc.*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
50fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (oc.*pmcv)();
51fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (ov.*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'volatile' qualifier}}
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (ov.*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
54fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (ov.*pmv)();
55fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (ov.*pmcv)();
56fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (ocv.*pm)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}}' drops 'const volatile' qualifiers}}
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (ocv.*pmc)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} const' drops 'volatile' qualifier}}
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  (ocv.*pmv)(); // expected-error-re{{call to pointer to member function of type 'void (){{( __attribute__\(\(thiscall\)\))?}} volatile' drops 'const' qualifier}}
60fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor  (ocv.*pmcv)();
61fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor}
62