diff options
author | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-06 08:34:53 +0000 |
---|---|---|
committer | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-05-06 08:34:53 +0000 |
commit | 99ad145a9a9f057b5a710fd0ef55a96c59d87942 (patch) | |
tree | 192cba8d3931d0c9f754675ae29696b4a8ad538e | |
parent | c28818746c35d2f85f24664fb835cd4ab95b53c9 (diff) | |
download | gcc-99ad145a9a9f057b5a710fd0ef55a96c59d87942.tar.gz |
Fix PR c++/48838
gcc/cp
PR c++/48838
* cp-tree.h (non_static_member_function_p): Declare new function.
* tree.c (non_static_member_function_p): Define it.
* semantics.c (finish_call_expr): Use it.
gcc/testsuite
PR c++/48838
* g++.dg/template/member9.C: New test case.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173473 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/cp/tree.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/member9.C | 21 |
6 files changed, 51 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9dbb57f1049..dfaaeaa54c1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2011-05-06 Dodji Seketeli <dodji@redhat.com> + + PR c++/48838 + * cp-tree.h (non_static_member_function_p): Declare new function. + * tree.c (non_static_member_function_p): Define it. + * semantics.c (finish_call_expr): Use it. + 2011-05-05 Nathan Froyd <froydnj@codesourcery.com> * decl.c (finish_case_label): Omit the loc argument to diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index fcb715ce7dd..9d13393502d 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5432,6 +5432,7 @@ extern tree get_fns (tree); extern tree get_first_fn (tree); extern tree ovl_cons (tree, tree); extern tree build_overload (tree, tree); +extern bool non_static_member_function_p (tree); extern const char *cxx_printable_name (tree, int); extern const char *cxx_printable_name_translate (tree, int); extern tree build_exception_variant (tree, tree); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 8bf5a521dd4..a2b24d3e31d 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2039,8 +2039,7 @@ finish_call_expr (tree fn, VEC(tree,gc) **args, bool disallow_virtual, is not included in *ARGS even though it is considered to be part of the list of arguments. Note that this is related to CWG issues 515 and 1005. */ - || (((TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE) - || BASELINK_P (fn)) + || (non_static_member_function_p (fn) && current_class_ref && type_dependent_expression_p (current_class_ref))) { diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 32303930527..d6365488957 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1480,6 +1480,22 @@ build_overload (tree decl, tree chain) return ovl_cons (decl, chain); } +/* Return TRUE if FN is a non-static member function, FALSE otherwise. + This function looks into BASELINK and OVERLOAD nodes. */ + +bool +non_static_member_function_p (tree fn) +{ + if (fn == NULL_TREE) + return false; + + if (is_overloaded_fn (fn)) + fn = get_first_fn (fn); + + return (DECL_P (fn) + && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)); +} + #define PRINT_RING_SIZE 4 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0fe877fac3f..3e89c93a159 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-06 Dodji Seketeli <dodji@redhat.com> + + PR c++/48838 + * g++.dg/template/member9.C: New test case. + 2011-05-05 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/discr29.ad[sb]: New test. diff --git a/gcc/testsuite/g++.dg/template/member9.C b/gcc/testsuite/g++.dg/template/member9.C new file mode 100644 index 00000000000..f15272db7ab --- /dev/null +++ b/gcc/testsuite/g++.dg/template/member9.C @@ -0,0 +1,21 @@ +// Origin PR c++/48838 +// { dg-do compile } + +class DUChainItemSystem +{ +public: + + template<class T> + void registerTypeClass(); + + static DUChainItemSystem& self(); +}; + +template<class T> +struct DUChainItemRegistrator +{ + DUChainItemRegistrator() + { + DUChainItemSystem::self().registerTypeClass<T>(); + } +}; |