>>936 標準の (14.6.4.2/1) をそのまま読む限りでは, unqualified name lookup として 解決される名前は point of definition の文脈のみが考慮されて, associated namespaces を用いた名前解決(要するにADL)では,point of definitionと point of instantiation の双方の文脈が考慮されるみたいですね.なので,
>>936 の f1(1) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合, unqualified name lookup では f2 の呼び出しを定義している場所(point of definition) からは f2 という名前は解決されないので失敗し,さらに f2(t) は int を引数とした 呼び出しのために associated sets of namespaces and classes も空 (3.4.2/2) の ため,ADL 経由でも f2 は見つからずに,結果 f2(t) という関数呼び出しに対応する 名前の解決が失敗する.
一方で,>>938 の f1(a()) 及び f1(adl::a()) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合,>>936 と同様 unqualified name lookup による名前解決は 失敗する.ところが,a 及び adl::a はユーザ定義型で,各々グローバルと adl が associated namespace になる.この場合,f2(t) という呼び出しが定義されている 場所 (point of definition) と f1 がインスタンス化された場所 (point of instantiation) 双方の文脈が名前解決において考慮される.結果, point of instantiation の文脈で void f2(a) と void adl::f2(adl::a) が visible のため,これらの名前解決が成功する.
と,こういう感じだと思います.ちなみに VC++7.1 の挙動は,dependent name だろうが non-dependent name だろうが,ADL 経由だろうがなかろうが,全て point of instantiation の文脈も考慮するという実装になっているための結果で, これは標準に準拠した挙動ではないです.