Patchwork fix c++/47589 - backport to 4.4 branch

login
register
mail settings
Submitter Jonathan Wakely
Date Feb. 3, 2011, 12:19 a.m.
Message ID <AANLkTimy-0dfdBd1cGbFS93oFqH-K4=9N+8boQpmsN+i@mail.gmail.com>
Download mbox | patch
Permalink /patch/81600/
State New
Headers show

Comments

Jonathan Wakely - Feb. 3, 2011, 12:19 a.m.
this patch fixes PR c++/47589 (a 4.3/4.4 ice-on-valid-code regression)
by backporting Jakub's fix for c++/45894, which was caused by the same
problem but only manifested with -std=c++0x -Wsequence-point

Jakub's new test doesn't compile on the 4.4 branch, so this adds a new
test reduced from the original reproducer attached to c++/47589

Tested x86_64-linux, OK for 4.4?

==> cp/ChangeLog <==
2011-02-02  Jonathan Wakely  <jwakely.gcc@gmail.com>

        PR c++/47589
        Backport from mainline
        2010-11-09  Jakub Jelinek  <jakub@redhat.com>

        PR c++/45894
        * tree.c (lvalue_kind): Don't crash if ref has NULL type.

==> testsuite/ChangeLog <==
2011-02-02  Jonathan Wakely  <jwakely.gcc@gmail.com>

        PR c++/47589
        * g++.dg/pr47589.C: New test.


Should I also check the new test into the 4.5 branch and trunk to
avoid future regressions?
Richard Guenther - Feb. 3, 2011, 10:06 a.m.
On Thu, Feb 3, 2011 at 1:19 AM, Jonathan Wakely <jwakely.gcc@gmail.com> wrote:
> this patch fixes PR c++/47589 (a 4.3/4.4 ice-on-valid-code regression)
> by backporting Jakub's fix for c++/45894, which was caused by the same
> problem but only manifested with -std=c++0x -Wsequence-point
>
> Jakub's new test doesn't compile on the 4.4 branch, so this adds a new
> test reduced from the original reproducer attached to c++/47589
>
> Tested x86_64-linux, OK for 4.4?
>
> ==> cp/ChangeLog <==
> 2011-02-02  Jonathan Wakely  <jwakely.gcc@gmail.com>
>
>        PR c++/47589
>        Backport from mainline
>        2010-11-09  Jakub Jelinek  <jakub@redhat.com>
>
>        PR c++/45894
>        * tree.c (lvalue_kind): Don't crash if ref has NULL type.
>
> ==> testsuite/ChangeLog <==
> 2011-02-02  Jonathan Wakely  <jwakely.gcc@gmail.com>
>
>        PR c++/47589
>        * g++.dg/pr47589.C: New test.
>
>
> Should I also check the new test into the 4.5 branch and trunk to
> avoid future regressions?

Yes, testcases should always go to all newer branches (and trunk) as well.

Richard.
Jason Merrill - Feb. 3, 2011, 4:51 p.m.
OK.

Jason

Patch

Index: cp/tree.c
===================================================================
--- cp/tree.c	(revision 169769)
+++ cp/tree.c	(working copy)
@@ -72,7 +72,8 @@  lvalue_p_1 (tree ref)
 	  == REFERENCE_TYPE)
     return lvalue_p_1 (TREE_OPERAND (ref, 0));
 
-  if (TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
+  if (TREE_TYPE (ref)
+      && TREE_CODE (TREE_TYPE (ref)) == REFERENCE_TYPE)
     {
       /* unnamed rvalue references are rvalues */
       if (TYPE_REF_IS_RVALUE (TREE_TYPE (ref))
Index: testsuite/g++.dg/pr47589.C
===================================================================
--- testsuite/g++.dg/pr47589.C	(revision 0)
+++ testsuite/g++.dg/pr47589.C	(revision 0)
@@ -0,0 +1,26 @@ 
+// PR c++/47589
+// { dg-do compile }
+
+struct F
+{
+    typedef void(*Cb)();
+
+    F(Cb);
+};
+
+struct C
+{
+    template<class D> static void f();
+};
+
+template<class D>
+struct TF : F
+{
+    TF() : F(C::f<D>) { }
+};
+
+struct DTC : TF<DTC>
+{
+    DTC() { }
+};
+