diff options
author | Jason Merrill <jason@redhat.com> | 2015-08-20 16:55:15 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2015-08-20 16:55:15 -0400 |
commit | 062ed8758dbf3403c6dd1731f95b36b3770c77d5 (patch) | |
tree | 5ea7ad87147e05cca5d2800b0b67bdd84c0378da | |
parent | 4ba1fef27d93933704aef2a0b39aed2f9a2ab842 (diff) | |
download | gcc-062ed8758dbf3403c6dd1731f95b36b3770c77d5.zip gcc-062ed8758dbf3403c6dd1731f95b36b3770c77d5.tar.gz gcc-062ed8758dbf3403c6dd1731f95b36b3770c77d5.tar.bz2 |
* name-lookup.c (hidden_name_p): Handle OVERLOAD.
From-SVN: r227044
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/friend16.C | 24 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend15.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend18.C | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/friend32.C | 4 |
6 files changed, 43 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 53d4feb..245cf11 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2015-08-20 Jason Merrill <jason@redhat.com> + + * name-lookup.c (hidden_name_p): Handle OVERLOAD. + 2015-08-20 Paolo Carlini <paolo.carlini@oracle.com> PR c++/67065 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 79e2863..baaf3e7 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4346,6 +4346,13 @@ hidden_name_p (tree val) && TYPE_FUNCTION_OR_TEMPLATE_DECL_P (val) && DECL_ANTICIPATED (val)) return true; + if (TREE_CODE (val) == OVERLOAD) + { + for (tree o = val; o; o = OVL_CHAIN (o)) + if (!hidden_name_p (OVL_FUNCTION (o))) + return false; + return true; + } return false; } diff --git a/gcc/testsuite/g++.dg/lookup/friend16.C b/gcc/testsuite/g++.dg/lookup/friend16.C new file mode 100644 index 0000000..bb27773 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend16.C @@ -0,0 +1,24 @@ +namespace std { + class ostream; +} + +namespace N2 { + class C0 {}; +} + +std::ostream& operator<<( std::ostream& os_, const N2::C0& m_); + +namespace N1 { + class C1 { + friend std::ostream& operator<<(std::ostream& os, const C1& what); + }; + + class C2 { + friend std::ostream& operator<<(std::ostream& os, const C2& what); + }; + + void foo(std::ostream & os, const N2::C0& m) + { + os << m; // Is this line valid? + } +} diff --git a/gcc/testsuite/g++.dg/template/friend15.C b/gcc/testsuite/g++.dg/template/friend15.C index 4acbf2d..15ba1c2 100644 --- a/gcc/testsuite/g++.dg/template/friend15.C +++ b/gcc/testsuite/g++.dg/template/friend15.C @@ -10,10 +10,11 @@ template <typename> class X { struct Inner; template <typename R> - friend typename X<R>::Inner * foo () { return 0; } + friend typename X<R>::Inner * foo (X<R>*) { return 0; } }; template class X<void>; +X<void>* p; struct U { - void bar () { foo<void> (); } + void bar () { foo (p); } }; diff --git a/gcc/testsuite/g++.dg/template/friend18.C b/gcc/testsuite/g++.dg/template/friend18.C index 04ba26e..712d488 100644 --- a/gcc/testsuite/g++.dg/template/friend18.C +++ b/gcc/testsuite/g++.dg/template/friend18.C @@ -7,13 +7,14 @@ template <int N> struct X { - template <int M> friend int foo(X const &) + template <int M> friend int foo(X const &, X<M> const&) { return N * 10000 + M; } }; X<1234> bring; +X<5678> brung; int main() { - return foo<5678> (bring) != 12345678; + return foo (bring, brung) != 12345678; } diff --git a/gcc/testsuite/g++.old-deja/g++.pt/friend32.C b/gcc/testsuite/g++.old-deja/g++.pt/friend32.C index 512a69a..db8b724 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/friend32.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/friend32.C @@ -7,8 +7,8 @@ struct S { }; template class S<int, double>; -template char f(char, long, short); -template char* f(char*, long*, short*); +template char f(char, long, short); // { dg-error "f" } +template char* f(char*, long*, short*); // { dg-error "f" } template <class X, class Y, class Z> X f(X x, Y, Z) { |