riccibruno marked 2 inline comments as done. riccibruno added a comment. (I have numbered your examples to make the discussion easier, and moved to a non-inline comment to have more space)
foo(ft_t<N::T>); // OK: ADL considers N::foo (nobody but GCC implements this) #1 foo(vt_t<N::T>); // Error: ADL does not consider N::foo #2 foo(ft_t<N::A>); // Error: ADL does not consider N::foo #3 foo(vt_t<N::A>); // Error: ADL does not consider N::foo #4 foo(ft_nt<N::V>); // Error: ADL does not consider N::foo #5 foo(vt_nt<N::V>); // Error: ADL does not consider N::foo #6 foo(vt_nt<N::F>); // Error: ADL does not consider N::foo #7 foo(ft_tt<N::TT>); // OK: ADL considers N::foo (nobody but GCC implements this) #8 foo(vt_tt<N::TT>); // Error: ADL does not consider N::foo #9 foo(ft_tt<N::AT>); // OK: ADL considers N::foo (nobody but GCC implements this) #10 foo( (ft_t<N::T>) ); // OK??: ADL considers N::foo (nobody but GCC implements this) #11 foo( &ft_t<N::T> ); // OK??: ADL considers N::foo (nobody but GCC implements this) #12 foo( (ft_tt<N::TT>) ); // OK??: ADL considers N::foo (nobody but GCC implements this) #13 foo( &ft_tt<N::TT> ); // OK??: ADL considers N::foo (nobody but GCC implements this) #14 foo( (ft_tt<N::AT>) ); // OK??: ADL considers N::foo (nobody but GCC implements this) #15 foo( &ft_tt<N::AT> ); // OK??: ADL considers N::foo (nobody but GCC implements this) #16 I am sympathetic to your concerns about having consistent rules for ADL in these examples. However I am not sure that the conclusion here is to ban them. First I believe that the examples #11-#16 are just variations of the previous examples because of [over.over]p1: `The overloaded function name can be preceded by the & operator. [...]`. The examples involving a variable template are currently not supported, but it may be just because it is omitted from the list of ADL rules ? It might be worth filing an issue asking for clarification about this case. WDYT ? (In general I have noticed that variable templates are rarely mentioned in the standard). The examples #3, #4 are a consequence of the fact that builtin types have no associated namespaces and classes. But this is something that is consistent; just use a class type instead if ADL is intended to be used. Similarly the examples #5. #6, and #7 are consistent; for now, don't rely on ADL with NTTPs (similarly perhaps this case should also be included in the ADL rules since C++20 will allow class types as NTTPs ? I did not see any discussion about this issue in P0732r2.) Repository: rC Clang CHANGES SINCE LAST ACTION https://reviews.llvm.org/D60570/new/ https://reviews.llvm.org/D60570 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits