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 27fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pc->*pm)(); // expected-error{{call to pointer to member function of type 'void ()' drops 'const' qualifier}} 28fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pc->*pmc)(); 29fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pc->*pmv)(); // expected-error{{call to pointer to member function of type 'void () volatile' drops 'const' qualifier}} 30fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pc->*pmcv)(); 31fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor 32fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pv->*pm)(); // expected-error{{call to pointer to member function of type 'void ()' drops 'volatile' qualifier}} 33fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pv->*pmc)(); // expected-error{{call to pointer to member function of type 'void () const' drops 'volatile' qualifier}} 34fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pv->*pmv)(); 35fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pv->*pmcv)(); 36fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor 37fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pcv->*pm)(); // expected-error{{call to pointer to member function of type 'void ()' drops 'const volatile' qualifiers}} 38fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pcv->*pmc)(); // expected-error{{call to pointer to member function of type 'void () const' drops 'volatile' qualifier}} 39fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (pcv->*pmv)(); // expected-error{{call to pointer to member function of type 'void () 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 47fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (oc.*pm)(); // expected-error{{call to pointer to member function of type 'void ()' drops 'const' qualifier}} 48fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (oc.*pmc)(); 49fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (oc.*pmv)(); // expected-error{{call to pointer to member function of type 'void () volatile' drops 'const' qualifier}} 50fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (oc.*pmcv)(); 51fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor 52fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ov.*pm)(); // expected-error{{call to pointer to member function of type 'void ()' drops 'volatile' qualifier}} 53fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ov.*pmc)(); // expected-error{{call to pointer to member function of type 'void () const' drops 'volatile' qualifier}} 54fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ov.*pmv)(); 55fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ov.*pmcv)(); 56fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor 57fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ocv.*pm)(); // expected-error{{call to pointer to member function of type 'void ()' drops 'const volatile' qualifiers}} 58fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ocv.*pmc)(); // expected-error{{call to pointer to member function of type 'void () const' drops 'volatile' qualifier}} 59fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ocv.*pmv)(); // expected-error{{call to pointer to member function of type 'void () volatile' drops 'const' qualifier}} 60fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor (ocv.*pmcv)(); 61fdc13a00a0077383eabf6d994de10203568415bbDouglas Gregor} 62