Jason Merrill <ja...@redhat.com> writes:

> On 04/13/2011 10:23 AM, Jakub Jelinek wrote:
>> Then
>>
>> --- gcc/cp/class.c.jj        2011-04-12 19:43:49.000000000 +0200
>> +++ gcc/cp/class.c   2011-04-13 15:23:07.463670993 +0200
>> @@ -5939,6 +5939,7 @@ fixed_type_or_null (tree instance, int *
>>           itself.  */
>>        if (TREE_CODE (instance) == VAR_DECL
>>      &&  DECL_INITIAL (instance)
>> +    &&  !type_dependent_expression_p (DECL_INITIAL (instance))
>>      &&  !htab_find (ht, instance))
>>          {
>>            tree type;
>>
>> would be shorter, after that if it returns NULL_TREE.
>
> Yep.

Thanks I am committing this then.

-- 
                Dodji

commit 9ff90e47bafaab67e0c41aa5341a2424726db8a8
Author: Dodji Seketeli <do...@redhat.com>
Date:   Wed Apr 13 12:30:51 2011 +0200

    PR c++/48574
    
    gcc/cp/
    
        * class.c (fixed_type_or_null): We cannot determine the dynamic
        type of a reference variable if its initializer is dependent.
    
    gcc/testsuite/
    
        * g++.dg/template/dependent-expr7.C: New test case.

diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index b6aebae..3216068 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -5939,6 +5939,7 @@ fixed_type_or_null (tree instance, int *nonnull, int 
*cdtorp)
             itself.  */
          if (TREE_CODE (instance) == VAR_DECL
              && DECL_INITIAL (instance)
+             && !type_dependent_expression_p (DECL_INITIAL (instance))
              && !htab_find (ht, instance))
            {
              tree type;
diff --git a/gcc/testsuite/g++.dg/template/dependent-expr7.C 
b/gcc/testsuite/g++.dg/template/dependent-expr7.C
new file mode 100644
index 0000000..b246820
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/dependent-expr7.C
@@ -0,0 +1,22 @@
+// Origin PR c++/48574
+// { dg-do compile }
+
+struct A
+{
+  virtual void foo();
+};
+
+template <typename T>
+void
+bar(T x)
+{
+  A &b = *x;
+  b.foo ();
+}
+
+void
+foo()
+{
+  A a;
+  bar(&a);
+}

Reply via email to