diff --git a/CMakeLists.txt b/CMakeLists.txt index 3eee3310790bfb17e0f5831fd7dd3a94d0e7051c..71138771945c6ed087599e80d8f94a16b89bdf4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -205,6 +205,8 @@ KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_MEMBER_TEMPLATES "Checking for member template support" DIRECT) KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_FULL_SPECIALIZATION "Checking for standard template specialization syntax" DIRECT) +KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP + "Checking whether argument dependent lookup is supported" DIRECT) IF(UNIX) KWSYS_PLATFORM_CXX_TEST(KWSYS_STAT_HAS_ST_MTIM diff --git a/Configure.hxx.in b/Configure.hxx.in index 512b689dd96a84742ab62deaa31af9b133c57156..785823941c5b4780875c0385854b2dba64bb1977 100644 --- a/Configure.hxx.in +++ b/Configure.hxx.in @@ -76,6 +76,9 @@ /* Whether the compiler supports member templates. */ #define @KWSYS_NAMESPACE@_CXX_HAS_MEMBER_TEMPLATES @KWSYS_CXX_HAS_MEMBER_TEMPLATES@ +/* Whether the compiler supports argument dependent lookup. */ +#define @KWSYS_NAMESPACE@_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP @KWSYS_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP@ + /* Whether the compiler supports standard full specialization syntax. */ #define @KWSYS_NAMESPACE@_CXX_HAS_FULL_SPECIALIZATION @KWSYS_CXX_HAS_FULL_SPECIALIZATION@ @@ -128,6 +131,7 @@ # define KWSYS_CXX_DECL_TYPENAME @KWSYS_NAMESPACE@_CXX_DECL_TYPENAME # define KWSYS_STL_HAS_ALLOCATOR_REBIND @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_REBIND # define KWSYS_STL_HAS_ALLOCATOR_MAX_SIZE_ARGUMENT @KWSYS_NAMESPACE@_STL_HAS_ALLOCATOR_MAX_SIZE_ARGUMENT +# define KWSYS_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP @KWSYS_NAMESPACE@_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP #endif #endif diff --git a/hashtable.hxx.in b/hashtable.hxx.in index 1d3285b8a5f23d7d10ddd3d7c56c168308b02e7e..e1589bac4bc95c50da842d3519c59338795164d8 100644 --- a/hashtable.hxx.in +++ b/hashtable.hxx.in @@ -1087,6 +1087,14 @@ void hashtable<_Val,_Key,_HF,_Ex,_Eq,_All> } // namespace @KWSYS_NAMESPACE@ +// Normally the comparison operators should be found in the @KWSYS_NAMESPACE@ +// namespace by argument dependent lookup. For compilers that do not +// support it we must bring them into the global namespace now. +#if !@KWSYS_NAMESPACE@_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP +using @KWSYS_NAMESPACE@::operator==; +using @KWSYS_NAMESPACE@::operator!=; +#endif + #if defined(_MSC_VER) # pragma warning (pop) #endif diff --git a/kwsysPlatformCxxTests.cxx b/kwsysPlatformCxxTests.cxx index 74e83bd41edf63483abe305314a9b04fc26edce4..9edbfc0ab5767e8144c61f250dafce31502ef00c 100644 --- a/kwsysPlatformCxxTests.cxx +++ b/kwsysPlatformCxxTests.cxx @@ -108,6 +108,20 @@ template <> struct A<int*> int main() { return A<int*>::f(); } #endif +#ifdef TEST_KWSYS_CXX_HAS_ARGUMENT_DEPENDENT_LOOKUP +namespace N +{ + class A {}; + int f(A*) { return 0; } +} +void f(void*); +int main() +{ + N::A* a = 0; + return f(a); +} +#endif + #ifdef TEST_KWSYS_STL_HAS_ALLOCATOR_REBIND #include <memory> template <class T, class Alloc>