1*ac991bbbSJohannes Doerfert // RUN: %clang_cc1 %s -verify -fsyntax-only 2*ac991bbbSJohannes Doerfert 3*ac991bbbSJohannes Doerfert // expected-no-diagnostics 4*ac991bbbSJohannes Doerfert 5*ac991bbbSJohannes Doerfert class C_in_class { 6*ac991bbbSJohannes Doerfert #include "../Sema/attr-callback.c" 7*ac991bbbSJohannes Doerfert }; 8*ac991bbbSJohannes Doerfert 9*ac991bbbSJohannes Doerfert struct Base { 10*ac991bbbSJohannes Doerfert 11*ac991bbbSJohannes Doerfert void no_args_1(void (*callback)(void)); 12*ac991bbbSJohannes Doerfert __attribute__((callback(1))) void no_args_2(void (*callback)(void)); no_args_3Base13*ac991bbbSJohannes Doerfert __attribute__((callback(callback))) void no_args_3(void (*callback)(void)) {} 14*ac991bbbSJohannes Doerfert 15*ac991bbbSJohannes Doerfert __attribute__((callback(1, 0))) virtual void 16*ac991bbbSJohannes Doerfert this_tr(void (*callback)(Base *)); 17*ac991bbbSJohannes Doerfert 18*ac991bbbSJohannes Doerfert __attribute__((callback(1, this, __, this))) virtual void 19*ac991bbbSJohannes Doerfert this_unknown_this(void (*callback)(Base *, Base *, Base *)); 20*ac991bbbSJohannes Doerfert 21*ac991bbbSJohannes Doerfert __attribute__((callback(1))) virtual void 22*ac991bbbSJohannes Doerfert virtual_1(void (*callback)(void)); 23*ac991bbbSJohannes Doerfert 24*ac991bbbSJohannes Doerfert __attribute__((callback(callback))) virtual void 25*ac991bbbSJohannes Doerfert virtual_2(void (*callback)(void)); 26*ac991bbbSJohannes Doerfert 27*ac991bbbSJohannes Doerfert __attribute__((callback(1))) virtual void 28*ac991bbbSJohannes Doerfert virtual_3(void (*callback)(void)); 29*ac991bbbSJohannes Doerfert }; 30*ac991bbbSJohannes Doerfert 31*ac991bbbSJohannes Doerfert __attribute__((callback(1))) void no_args_1(void (* callback)(void))32*ac991bbbSJohannes DoerfertBase::no_args_1(void (*callback)(void)) { 33*ac991bbbSJohannes Doerfert } 34*ac991bbbSJohannes Doerfert no_args_2(void (* callback)(void))35*ac991bbbSJohannes Doerfertvoid Base::no_args_2(void (*callback)(void)) { 36*ac991bbbSJohannes Doerfert } 37*ac991bbbSJohannes Doerfert 38*ac991bbbSJohannes Doerfert struct Derived_1 : public Base { 39*ac991bbbSJohannes Doerfert 40*ac991bbbSJohannes Doerfert __attribute__((callback(1, 0))) virtual void 41*ac991bbbSJohannes Doerfert this_tr(void (*callback)(Base *)) override; 42*ac991bbbSJohannes Doerfert 43*ac991bbbSJohannes Doerfert __attribute__((callback(1))) virtual void virtual_1Derived_144*ac991bbbSJohannes Doerfert virtual_1(void (*callback)(void)) override {} 45*ac991bbbSJohannes Doerfert 46*ac991bbbSJohannes Doerfert virtual void virtual_3Derived_147*ac991bbbSJohannes Doerfert virtual_3(void (*callback)(void)) override {} 48*ac991bbbSJohannes Doerfert }; 49*ac991bbbSJohannes Doerfert 50*ac991bbbSJohannes Doerfert struct Derived_2 : public Base { 51*ac991bbbSJohannes Doerfert 52*ac991bbbSJohannes Doerfert __attribute__((callback(callback))) virtual void 53*ac991bbbSJohannes Doerfert virtual_1(void (*callback)(void)) override; 54*ac991bbbSJohannes Doerfert 55*ac991bbbSJohannes Doerfert virtual void 56*ac991bbbSJohannes Doerfert virtual_2(void (*callback)(void)) override; 57*ac991bbbSJohannes Doerfert 58*ac991bbbSJohannes Doerfert virtual void 59*ac991bbbSJohannes Doerfert virtual_3(void (*callback)(void)) override; 60*ac991bbbSJohannes Doerfert }; 61*ac991bbbSJohannes Doerfert virtual_1(void (* callback)(void))62*ac991bbbSJohannes Doerfertvoid Derived_2::virtual_1(void (*callback)(void)) {} 63*ac991bbbSJohannes Doerfert 64*ac991bbbSJohannes Doerfert __attribute__((callback(1))) void virtual_2(void (* callback)(void))65*ac991bbbSJohannes DoerfertDerived_2::virtual_2(void (*callback)(void)) {} 66*ac991bbbSJohannes Doerfert virtual_3(void (* callback)(void))67*ac991bbbSJohannes Doerfertvoid Derived_2::virtual_3(void (*callback)(void)) {} 68