diff options
author | Dodji Seketeli <dodji@redhat.com> | 2011-02-11 07:33:53 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2011-02-11 08:33:53 +0100 |
commit | e60b3ac94f14f994f7f8e79e1090a9d4a4151063 (patch) | |
tree | a31e9d3fefeb275bcc5366e7d02ccd9608295274 /gcc/cp | |
parent | 942e57396b4a3322efdec5c8f7a8d5b6665cf875 (diff) | |
download | gcc-e60b3ac94f14f994f7f8e79e1090a9d4a4151063.zip gcc-e60b3ac94f14f994f7f8e79e1090a9d4a4151063.tar.gz gcc-e60b3ac94f14f994f7f8e79e1090a9d4a4151063.tar.bz2 |
re PR c++/47172 ([C++0x] cannot call member function without object)
Fix PR c++/47172
gcc/cp/
PR c++/47172
* pt.c (finish_call_expr): Consider a call expression that has a
dependent "this" pointer as being dependent. Add comments.
(dependent_type_p, type_dependent_expression_p): Update comments.
gcc/testsuite/
* g++.dg/template/inherit6.C: New test.
From-SVN: r170045
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 7 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 14 |
3 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c3f780a..98c5668 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2011-02-11 Dodji Seketeli <dodji@redhat.com> + + PR c++/47172 + * pt.c (finish_call_expr): Consider a call expression that has a + dependent "this" pointer as being dependent. Add comments. + (dependent_type_p, type_dependent_expression_p): Update comments. + 2011-02-09 Jason Merrill <jason@redhat.com> * decl.c (cp_make_fname_decl): Set DECL_THIS_STATIC at toplevel. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d59f32a..a55a35a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -17912,7 +17912,7 @@ dependent_type_p_r (tree type) } /* Returns TRUE if TYPE is dependent, in the sense of - [temp.dep.type]. */ + [temp.dep.type]. Note that a NULL type is considered dependent. */ bool dependent_type_p (tree type) @@ -18184,7 +18184,10 @@ value_dependent_expression_p (tree expression) } /* Returns TRUE if the EXPRESSION is type-dependent, in the sense of - [temp.dep.expr]. */ + [temp.dep.expr]. Note that an expression with no type is + considered dependent. Other parts of the compiler arrange for an + expression with type-dependent subexpressions to have no type, so + this function doesn't have to be fully recursive. */ bool type_dependent_expression_p (tree expression) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 58a59ee..a941b3b 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2028,8 +2028,20 @@ finish_call_expr (tree fn, VEC(tree,gc) **args, bool disallow_virtual, if (processing_template_decl) { + /* If the call expression is dependent, build a CALL_EXPR node + with no type; type_dependent_expression_p recognizes + expressions with no type as being dependent. */ if (type_dependent_expression_p (fn) - || any_type_dependent_arguments_p (*args)) + || any_type_dependent_arguments_p (*args) + /* For a non-static member function, we need to specifically + test the type dependency of the "this" pointer because it + 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 (fn) == FUNCTION_DECL + && DECL_NONSTATIC_MEMBER_FUNCTION_P (fn) + && current_class_ref + && type_dependent_expression_p (current_class_ref))) { result = build_nt_call_vec (fn, *args); KOENIG_LOOKUP_P (result) = koenig_p; |