Patchwork Fix PR c++/47172

login
register
mail settings
Submitter Dodji Seketeli
Date Feb. 10, 2011, 9:44 p.m.
Message ID <m34o8ba7jj.fsf@redhat.com>
Download mbox | patch
Permalink /patch/82670/
State New
Headers show

Comments

Dodji Seketeli - Feb. 10, 2011, 9:44 p.m.
Gabriel Dos Reis <gdr@integrable-solutions.net> writes:

> thanks.  A small nit:
>
>>  /* 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 be fully recursive.  */
>
> missing "to" before "be fully".

Good catch. Corrected below.

Thanks.
Jason Merrill - Feb. 11, 2011, 12:32 a.m.
OK.

Jason
H.J. Lu - Feb. 11, 2011, 2:55 p.m.
On Thu, Feb 10, 2011 at 1:44 PM, Dodji Seketeli <dodji@redhat.com> wrote:
> Gabriel Dos Reis <gdr@integrable-solutions.net> writes:
>
>> thanks.  A small nit:
>>
>>>  /* 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 be fully recursive.  */
>>
>> missing "to" before "be fully".
>
> Good catch. Corrected below.
>
> Thanks.
>
> --
>                Dodji
>
> From 17f8295fff945d9130cd3630bad476daf43e8d40 Mon Sep 17 00:00:00 2001
> From: Dodji Seketeli <dodji@redhat.com>
> Date: Tue, 8 Feb 2011 10:05:36 +0100
> Subject: [PATCH] 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.

This caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47697

Patch

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;
diff --git a/gcc/testsuite/g++.dg/template/inherit6.C b/gcc/testsuite/g++.dg/template/inherit6.C
new file mode 100644
index 0000000..241a68e
--- /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 <class T>
+struct B : A { };
+
+template <class T>
+struct C : B<T>
+{
+    void g();
+};
+
+template <class T>
+void C<T>::g()
+{
+    A::f();
+}