aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-01-19 09:58:28 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-01-19 09:58:28 -0500
commite58d4228453c9e7036259acd104222bff680a880 (patch)
treee10c80857e5c3ff50467b08032a14eeaaab964d4 /gcc
parentaad038ca7c7322c6c050f68f8389fc1d2bd8a7da (diff)
downloadgcc-e58d4228453c9e7036259acd104222bff680a880.zip
gcc-e58d4228453c9e7036259acd104222bff680a880.tar.gz
gcc-e58d4228453c9e7036259acd104222bff680a880.tar.bz2
re PR c++/51889 (can't override a using-declaration in a template)
PR c++/51889 * class.c (finish_struct): Call add_method here for function usings. * semantics.c (finish_member_declaration): Not here. From-SVN: r183304
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c12
-rw-r--r--gcc/cp/semantics.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/inherit/using7.C12
5 files changed, 35 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b0660ce..adec924 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2012-01-19 Jason Merrill <jason@redhat.com>
+
+ PR c++/51889
+ * class.c (finish_struct): Call add_method here for function usings.
+ * semantics.c (finish_member_declaration): Not here.
+
2012-01-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51225
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 9b957fe..e6f33fe 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -6195,6 +6195,18 @@ finish_struct (tree t, tree attributes)
if (DECL_PURE_VIRTUAL_P (x))
VEC_safe_push (tree, gc, CLASSTYPE_PURE_VIRTUALS (t), x);
complete_vars (t);
+ /* We need to add the target functions to the CLASSTYPE_METHOD_VEC if
+ an enclosing scope is a template class, so that this function be
+ found by lookup_fnfields_1 when the using declaration is not
+ instantiated yet. */
+ for (x = TYPE_FIELDS (t); x; x = DECL_CHAIN (x))
+ if (TREE_CODE (x) == USING_DECL)
+ {
+ tree fn = strip_using_decl (x);
+ if (is_overloaded_fn (fn))
+ for (; fn; fn = OVL_NEXT (fn))
+ add_method (t, OVL_CURRENT (fn), x);
+ }
/* Remember current #pragma pack value. */
TYPE_PRECISION (t) = maximum_field_alignment;
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 40676b6..a5a10d0 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -2671,20 +2671,6 @@ finish_member_declaration (tree decl)
{
if (TREE_CODE (decl) == USING_DECL)
{
- /* We need to add the target functions to the
- CLASSTYPE_METHOD_VEC if an enclosing scope is a template
- class, so that this function be found by lookup_fnfields_1
- when the using declaration is not instantiated yet. */
-
- tree target_decl = strip_using_decl (decl);
- if (dependent_type_p (current_class_type)
- && is_overloaded_fn (target_decl))
- {
- tree t = target_decl;
- for (; t; t = OVL_NEXT (t))
- add_method (current_class_type, OVL_CURRENT (t), decl);
- }
-
/* For now, ignore class-scope USING_DECLS, so that
debugging backends do not see them. */
DECL_IGNORED_P (decl) = 1;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2fe1ddd..ea028e1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-01-19 Jason Merrill <jason@redhat.com>
+
+ PR c++/51889
+ * g++.dg/inherit/using7.C: New.
+
2012-01-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/37997
diff --git a/gcc/testsuite/g++.dg/inherit/using7.C b/gcc/testsuite/g++.dg/inherit/using7.C
new file mode 100644
index 0000000..de177c9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/using7.C
@@ -0,0 +1,12 @@
+// PR c++/51889
+
+struct A {
+ void f();
+};
+
+template <class T>
+struct B: A
+{
+ using A::f;
+ void f();
+};