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
This commit is contained in:
parent
fc2c5998f7
commit
1770aeed11
5 changed files with 52 additions and 3 deletions
|
@ -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-16 Dodji Seketeli <dodji@redhat.com>
|
||||
|
||||
PR c++/47326
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2011-02-11 Dodji Seketeli <dodji@redhat.com>
|
||||
|
||||
PR c++/47172
|
||||
* g++.dg/template/inherit6.C: New test.
|
||||
|
||||
2011-02-16 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/47745
|
||||
|
|
23
gcc/testsuite/g++.dg/template/inherit6.C
Normal file
23
gcc/testsuite/g++.dg/template/inherit6.C
Normal file
|
@ -0,0 +1,23 @@
|
|||
// Origin PR c++/47172
|
||||
// { dg-options "-std=c++0x" }
|
||||
// { dg-do compile }
|
||||
|
||||
struct A
|
||||
{
|
||||
int f() const;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
struct B : A { };
|
||||
|
||||
template <class T>
|
||||
struct C : B<T>
|
||||
{
|
||||
void g();
|
||||
};
|
||||
|
||||
template <class T>
|
||||
void C<T>::g()
|
||||
{
|
||||
A::f();
|
||||
}
|
Loading…
Add table
Reference in a new issue