112a9d9c8Sopenharmony_ci// bindgen-flags: --enable-cxx-namespaces -- -std=c++11 212a9d9c8Sopenharmony_ci 312a9d9c8Sopenharmony_ci// `Wrapper::sentry` and `sentry` should be emitted as `Wrapper_sentry` and 412a9d9c8Sopenharmony_ci// `sentry` respectively, but instead `Wrapper::sentry` is named just `sentry` 512a9d9c8Sopenharmony_ci// which leads to compilation errors. 612a9d9c8Sopenharmony_ci// 712a9d9c8Sopenharmony_ci// Note: if there is no namespace, then we don't run into problems. Similarly, 812a9d9c8Sopenharmony_ci// making the `Wrapper::sentry` definition inline in `Wrapper`, rather than 912a9d9c8Sopenharmony_ci// declared inline with an out of line definition, makes the problem go away as 1012a9d9c8Sopenharmony_ci// well. 1112a9d9c8Sopenharmony_ci 1212a9d9c8Sopenharmony_cinamespace whatever { 1312a9d9c8Sopenharmony_ci template <typename, typename> 1412a9d9c8Sopenharmony_ci class Wrapper { 1512a9d9c8Sopenharmony_ci // Declaration of Wrapper::sentry 1612a9d9c8Sopenharmony_ci class sentry; 1712a9d9c8Sopenharmony_ci }; 1812a9d9c8Sopenharmony_ci 1912a9d9c8Sopenharmony_ci // Definition of Wrapper::sentry 2012a9d9c8Sopenharmony_ci template <typename f, typename h> 2112a9d9c8Sopenharmony_ci class Wrapper<f, h>::sentry { 2212a9d9c8Sopenharmony_ci int i_am_wrapper_sentry; 2312a9d9c8Sopenharmony_ci }; 2412a9d9c8Sopenharmony_ci 2512a9d9c8Sopenharmony_ci class sentry { 2612a9d9c8Sopenharmony_ci bool i_am_plain_sentry; 2712a9d9c8Sopenharmony_ci }; 2812a9d9c8Sopenharmony_ci 2912a9d9c8Sopenharmony_ci // Ok, that was the original bug report. While we're here, let's just try 3012a9d9c8Sopenharmony_ci // lots of different things that could go wrong and make sure we handle them 3112a9d9c8Sopenharmony_ci // right. 3212a9d9c8Sopenharmony_ci 3312a9d9c8Sopenharmony_ci class NotTemplateWrapper { 3412a9d9c8Sopenharmony_ci class sentry; 3512a9d9c8Sopenharmony_ci }; 3612a9d9c8Sopenharmony_ci 3712a9d9c8Sopenharmony_ci class NotTemplateWrapper::sentry { 3812a9d9c8Sopenharmony_ci char i_am_not_template_wrapper_sentry; 3912a9d9c8Sopenharmony_ci }; 4012a9d9c8Sopenharmony_ci 4112a9d9c8Sopenharmony_ci class InlineNotTemplateWrapper { 4212a9d9c8Sopenharmony_ci class sentry { 4312a9d9c8Sopenharmony_ci bool i_am_inline_not_template_wrapper_sentry; 4412a9d9c8Sopenharmony_ci }; 4512a9d9c8Sopenharmony_ci }; 4612a9d9c8Sopenharmony_ci 4712a9d9c8Sopenharmony_ci template <typename, typename> 4812a9d9c8Sopenharmony_ci class InlineTemplateWrapper { 4912a9d9c8Sopenharmony_ci class sentry { 5012a9d9c8Sopenharmony_ci int i_am_inline_template_wrapper_sentry; 5112a9d9c8Sopenharmony_ci }; 5212a9d9c8Sopenharmony_ci }; 5312a9d9c8Sopenharmony_ci 5412a9d9c8Sopenharmony_ci class OuterDoubleWrapper { 5512a9d9c8Sopenharmony_ci class InnerDoubleWrapper { 5612a9d9c8Sopenharmony_ci class sentry; 5712a9d9c8Sopenharmony_ci }; 5812a9d9c8Sopenharmony_ci }; 5912a9d9c8Sopenharmony_ci 6012a9d9c8Sopenharmony_ci class OuterDoubleWrapper::InnerDoubleWrapper::sentry { 6112a9d9c8Sopenharmony_ci int i_am_double_wrapper_sentry; 6212a9d9c8Sopenharmony_ci }; 6312a9d9c8Sopenharmony_ci 6412a9d9c8Sopenharmony_ci class OuterDoubleInlineWrapper { 6512a9d9c8Sopenharmony_ci class InnerDoubleInlineWrapper { 6612a9d9c8Sopenharmony_ci class sentry { 6712a9d9c8Sopenharmony_ci int i_am_double_wrapper_inline_sentry; 6812a9d9c8Sopenharmony_ci }; 6912a9d9c8Sopenharmony_ci }; 7012a9d9c8Sopenharmony_ci }; 7112a9d9c8Sopenharmony_ci} 7212a9d9c8Sopenharmony_ci 7312a9d9c8Sopenharmony_citemplate <typename, typename> 7412a9d9c8Sopenharmony_ciclass OutsideNamespaceWrapper { 7512a9d9c8Sopenharmony_ci class sentry; 7612a9d9c8Sopenharmony_ci}; 7712a9d9c8Sopenharmony_ci 7812a9d9c8Sopenharmony_citemplate <typename f, typename h> 7912a9d9c8Sopenharmony_ciclass OutsideNamespaceWrapper<f, h>::sentry { 8012a9d9c8Sopenharmony_ci int i_am_outside_namespace_wrapper_sentry; 8112a9d9c8Sopenharmony_ci}; 8212a9d9c8Sopenharmony_ci 8312a9d9c8Sopenharmony_ciclass sentry { 8412a9d9c8Sopenharmony_ci int i_am_outside_namespace_sentry; 8512a9d9c8Sopenharmony_ci}; 86