aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-20 20:55:15 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2015-08-20 20:55:15 +0000
commitf2accd90a37ad9441ef7e72d6ff14077bf3ed6a4 (patch)
tree5ea7ad87147e05cca5d2800b0b67bdd84c0378da
parent1eac3b0cc949664d157ed8b0bf368df5e687ef7a (diff)
* name-lookup.c (hidden_name_p): Handle OVERLOAD.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227044 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/name-lookup.c7
-rw-r--r--gcc/testsuite/g++.dg/lookup/friend16.C24
-rw-r--r--gcc/testsuite/g++.dg/template/friend15.C5
-rw-r--r--gcc/testsuite/g++.dg/template/friend18.C5
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/friend32.C4
6 files changed, 43 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 53d4febe962..245cf11df78 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 79e28637cae..baaf3e7ca98 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 00000000000..bb27773d7be
--- /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 4acbf2d1a56..15ba1c27182 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 04ba26e9830..712d4889fea 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 512a69a09a4..db8b724635c 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) {