/** * This program checks if the compiler doesn't have a certain bug * that we encountered when testing C++11 features */ #include "test_config.h" #if defined (ACE_HAS_CPP11) #include #include namespace FOO { template class o_r; template struct o_t { typedef o_r ref_type; }; class T_base {}; template::value>::type, typename ...Args> o_r make_f(Args&& ...args); template class o_r final { public: template friend o_r<_Tp1> make_f(Args&& ...args); protected: typedef std::shared_ptr shared_ptr_type; template::value>::type> explicit o_r (_Tp1*) : stub_ () {} private: shared_ptr_type stub_; }; template inline o_r make_f(Args&& ...args) { return o_r (new T (std::forward (args)...)); } class A : public T_base { protected: A () = default; template friend o_r<_Tp1> make_f(Args&& ...args); }; o_t::ref_type create () { return make_f(); } class B {}; } int run_main (int, ACE_TCHAR *[]) { ACE_START_TEST (ACE_TEXT("Compiler_Features_24_Test")); FOO::o_r l = FOO::create(); #if defined __clang__ && \ (defined __apple_build_version__ && __apple_build_version__ < 9100000 \ || __clang_major__ < 5) ACE_ERROR ((LM_ERROR, ACE_TEXT ("ERROR: This version of clang doesn't") ACE_TEXT (" compile the C++11 code in this test.\n"))); ACE_END_TEST; return 1; #else FOO::o_r l2 = FOO::make_f(); // next line doesn't compile and shouldn't //FOO::o_r l3 = FOO::make_f(); ACE_DEBUG ((LM_INFO, ACE_TEXT ("Compiler Feature 24 Test does compile and run.\n"))); ACE_END_TEST; return 0; #endif } #else int run_main (int, ACE_TCHAR *[]) { ACE_START_TEST (ACE_TEXT("Compiler_Features_24_Test")); ACE_DEBUG ((LM_INFO, ACE_TEXT ("No C++11 support enabled\n"))); ACE_END_TEST; return 0; } #endif