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 Doerfert Base::no_args_1(void (*callback)(void)) {
33*ac991bbbSJohannes Doerfert }
34*ac991bbbSJohannes Doerfert 
no_args_2(void (* callback)(void))35*ac991bbbSJohannes Doerfert void 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 Doerfert void Derived_2::virtual_1(void (*callback)(void)) {}
63*ac991bbbSJohannes Doerfert 
64*ac991bbbSJohannes Doerfert __attribute__((callback(1))) void
virtual_2(void (* callback)(void))65*ac991bbbSJohannes Doerfert Derived_2::virtual_2(void (*callback)(void)) {}
66*ac991bbbSJohannes Doerfert 
virtual_3(void (* callback)(void))67*ac991bbbSJohannes Doerfert void Derived_2::virtual_3(void (*callback)(void)) {}
68