diff options
author | Jason Merrill <jason@redhat.com> | 2012-01-19 09:58:28 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2012-01-19 09:58:28 -0500 |
commit | e58d4228453c9e7036259acd104222bff680a880 (patch) | |
tree | e10c80857e5c3ff50467b08032a14eeaaab964d4 /gcc | |
parent | aad038ca7c7322c6c050f68f8389fc1d2bd8a7da (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/class.c | 12 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/using7.C | 12 |
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(); +}; |