1 // PR c++/49663
2 
3 struct Nosm
4 {
5     int m_R;
6 };
7 
8 namespace dx {
9 
10     struct onc
11     {
12         typedef void(*Cb)();
13 
14         onc(Cb cb);
15     };
16 
17     struct grac
18     {
19         template<class Derived> static void once();
20     };
21 
22     template<class Derived>
23         struct tonc : onc
24         {
tonctonc25             tonc() : onc(&grac::once<Derived>) {}
26 
27             static Derived& get();
28         };
29 
once()30     template<class Derived> void grac::once()
31     {
32         tonc<Derived>::get().h();
33     }
34 }
35 
36 namespace
37 {
38     template<typename T, int = sizeof(&T::m_R)>
39         struct has_R { };
40 
41     template<typename T>
42         inline void
43         setR(T* m, has_R<T>* = 0)
44         { }
45 
setR(...)46     inline void setR(...) { }
47 }
48 
49 template<typename M>
50     struct Qmi
51     : dx::tonc<Qmi<M> >
52     {
hQmi53         void h()
54         {
55             setR(&msg);
56         }
57 
58         M msg;
59     };
60 
61 Qmi<Nosm> x;
62