
Joaquín Mª López Muñoz wrote:
2. If the latter passes, try the attached test fsudba.cpp, which exercises an alternative way in which using declarations at function scope can break ADL.
Here's the output of :
xlC fsudba.cpp
"fsudba.cpp", line 11.28: 1540-0256 (S) A parameter of type "foo<int> &" cannot be initialized with an expression of type "int". "fsudba.cpp", line 11.28: 1540-1205 (I) The error occurred while converting to parameter 1 of "foo<int>::swap(foo<int> &)". "fsudba.cpp", line 8.14: 1540-0700 (I) The previous message was produced while processing "foo<int>::swap(foo<int> &)". "fsudba.cpp", line 24.8: 1540-0700 (I) The previous message was produced while processing "main()".
Bingo :) John, do you think then that BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL should be defined for __IBMCPP__<=800? Also, if you think it's appropriate I can add the test above to libs/config/test/boost_no_using_breaks_adl.ipp.
Hmmm, the interesting thing is, I'm having a hard time convincing myself that this code is legal, I'm cc'ing our friendly IBM compiler expert in case he can shed light on this. Consider the code again: #include <algorithm> template<typename T> struct foo { T t; foo():t(0){} void swap(foo& x) { using std::swap; swap(t,x.t); } }; template<typename T> void swap(foo<T>& x,foo<T>& y) { x.swap(y); } int main() { foo<int> x,y; x.swap(y); } In foo::swap the local declaration of the member function "swap" hides any occurances of swap in the outer scope, and the using declaration behaves "as if" std::swap were imported into the *enclosing namespace*, which would still be hidden... and yet I can't believe that this simple idiom isn't actually legal ! :-) And indeed all the other compilers I tested do compile this OK. Whatever the issue is, it's not really the same as BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL, but I'm not sure what it is the same as yet :-( On the other hand extending the scope of BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL might be the easiest workaround. At present, confused yours, John.