2017-06-06 Nathan Sidwell <nathan@acm.org>
PR c++/80979
* name-lookup.c (adl_class_only): Don't add visible friends.
===================================================================
@@ -801,6 +801,12 @@ name_lookup::adl_class_only (tree type)
if (CP_DECL_CONTEXT (fn) != context)
continue;
+ /* Only interested in anticipated friends. (Non-anticipated
+ ones will have been inserted during the namespace
+ adl.) */
+ if (!DECL_ANTICIPATED (fn))
+ continue;
+
/* Template specializations are never found by name lookup.
(Templates themselves can be found, but not template
specializations.) */
===================================================================
@@ -0,0 +1,26 @@
+// pr C++/80979 ICE with late discovery of using directives during ADL
+// of a friend declaration.
+
+namespace Tiny {
+ class Handsome {};
+ void Dahl (Handsome &, Handsome &);
+
+ namespace Jack {
+ class Vladof {
+ friend void Dahl (Vladof &, Vladof &);
+ };
+ void Dahl (Vladof &, Vladof &);
+ }
+
+ struct BDonk {};
+
+ namespace Tina {
+ void Dahl (BDonk &, Jack::Vladof &);
+ }
+ using Tina::Dahl;
+}
+
+void BoomBoom (Tiny::BDonk &vault, Tiny::Jack::Vladof &hunter)
+{
+ Dahl (vault, hunter);
+}