Merged revisions 208012,208018-208019,208021,208023-208030,208033,208037,208040-20804...
[official-gcc.git] / main / gcc / testsuite / g++.dg / template / access28.C
blob4dd53508dbfa85aaf18cf773c496ebb83975581f
1 // PR c++/49663
3 struct Nosm
5     int m_R;
6 };
8 namespace dx {
10     struct onc
11     {
12         typedef void(*Cb)();
14         onc(Cb cb);
15     };
17     struct grac
18     {
19         template<class Derived> static void once();
20     };
22     template<class Derived>
23         struct tonc : onc
24         {
25             tonc() : onc(&grac::once<Derived>) {}
27             static Derived& get();
28         };
30     template<class Derived> void grac::once()
31     {
32         tonc<Derived>::get().h();
33     }
36 namespace
38     template<typename T, int = sizeof(&T::m_R)>
39         struct has_R { };
41     template<typename T>
42         inline void
43         setR(T* m, has_R<T>* = 0)
44         { }
46     inline void setR(...) { }
49 template<typename M>
50     struct Qmi
51     : dx::tonc<Qmi<M> >
52     {
53         void h()
54         {
55             setR(&msg);
56         }
58         M msg;
59     };
61 Qmi<Nosm> x;