| // { dg-do run } |
| |
| // Copyright (C) 2002 Free Software Foundation, Inc. |
| // Contributed by Nathan Sidwell 24 Dec 2002 <nathan@codesourcery.com> |
| |
| // PR 5116. template instantiation can add a friend into a namespace, |
| // and thus change overload resolution. |
| |
| #include <iostream> |
| |
| static int right; |
| static int wrong; |
| |
| struct Buggy {}; |
| |
| template <typename T>struct Handle |
| { |
| Handle(T* p) {} |
| |
| operator bool() const { wrong++; return true; } |
| |
| friend std::ostream& operator<<(std::ostream& ostr, const Handle& r) |
| { |
| right++; |
| |
| return ostr << "in operator<<(ostream&, const Handle&)"; |
| } |
| }; |
| |
| typedef Handle<Buggy> Buggy_h; |
| |
| bool cmp (const Buggy_h& b1, const Buggy_h& b2) |
| { |
| std::cout << b1 << " " << b2 << std::endl; |
| return false; |
| } |
| |
| int main() |
| { |
| Buggy o; |
| |
| cmp (&o, &o); |
| |
| return !(right == 2 && !wrong); |
| } |