diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/cpp0x/regress/regress4.C')
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/regress/regress4.C | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/regress4.C b/gcc/testsuite/g++.dg/cpp0x/regress/regress4.C new file mode 100644 index 0000000000..b56263ae5a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/regress/regress4.C @@ -0,0 +1,62 @@ +// PR c++/49663 +// { dg-options -std=c++0x } + +struct Nosm +{ + int m_R; +}; + +namespace dx { + + struct onc + { + typedef void(*Cb)(); + + onc(Cb cb); + }; + + struct grac + { + template<class Derived> static void once(); + }; + + template<class Derived> + struct tonc : onc + { + tonc() : onc(&grac::once<Derived>) {} + + static Derived& get(); + }; + + template<class Derived> void grac::once() + { + tonc<Derived>::get().h(); + } +} + +namespace +{ + template<typename T, int = sizeof(&T::m_R)> + struct has_R { }; + + template<typename T> + inline void + setR(T* m, has_R<T>* = 0) + { } + + inline void setR(...) { } +} + +template<typename M> + struct Qmi + : dx::tonc<Qmi<M> > + { + void h() + { + setR(&msg); + } + + M msg; + }; + +Qmi<Nosm> x; |