From 1770aeed11c064c75507eaca52a9e49234f9eff6 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Thu, 17 Feb 2011 06:50:35 +0000 Subject: [PATCH] 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: r170240 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/pt.c | 7 +++++-- gcc/cp/semantics.c | 13 ++++++++++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/inherit6.C | 23 +++++++++++++++++++++++ 5 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/inherit6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dca96129d90..13de6bd9041 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2011-02-11 Dodji Seketeli + + 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-16 Dodji Seketeli PR c++/47326 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index aa956c8f209..02b8d155620 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -17921,7 +17921,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) @@ -18193,7 +18193,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 58a59eecacf..daa728096ee 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2028,8 +2028,19 @@ 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 (TREE_TYPE (fn)) == METHOD_TYPE) + && current_class_ref + && type_dependent_expression_p (current_class_ref))) { result = build_nt_call_vec (fn, *args); KOENIG_LOOKUP_P (result) = koenig_p; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19488e8d73b..5275e990546 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-02-11 Dodji Seketeli + + PR c++/47172 + * g++.dg/template/inherit6.C: New test. + 2011-02-16 Janus Weil PR fortran/47745 diff --git a/gcc/testsuite/g++.dg/template/inherit6.C b/gcc/testsuite/g++.dg/template/inherit6.C new file mode 100644 index 00000000000..241a68e5e4a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/inherit6.C @@ -0,0 +1,23 @@ +// Origin PR c++/47172 +// { dg-options "-std=c++0x" } +// { dg-do compile } + +struct A +{ + int f() const; +}; + +template +struct B : A { }; + +template +struct C : B +{ + void g(); +}; + +template +void C::g() +{ + A::f(); +}