]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/45894 ([C++0x] ICE: segmentation fault with -Wall)
authorJakub Jelinek <jakub@redhat.com>
Tue, 9 Nov 2010 11:52:59 +0000 (12:52 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 9 Nov 2010 11:52:59 +0000 (12:52 +0100)
PR c++/45894
* tree.c (lvalue_kind): Don't crash if ref has NULL type.

* g++.dg/warn/Wsequence-point-2.C: New test.

From-SVN: r166481

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wsequence-point-2.C [new file with mode: 0644]

index 7223529dd36ddd3230341d288cd3403e5b1d2fda..51e21714091fca4bb89400ab484dece613fa81df 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/45894
+       * tree.c (lvalue_kind): Don't crash if ref has NULL type.
+
 2010-11-08  Jason Merrill  <jason@redhat.com>
 
        PR c++/46382
index 462e35f3b71411c052d8489ec08a9a4c9717f098..ba8e978429325b4644b72c02f900894a7da3d2f5 100644 (file)
@@ -67,7 +67,8 @@ lvalue_kind (const_tree ref)
          == REFERENCE_TYPE)
     return lvalue_kind (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 f8c121efefe74cbfd8832cc0e70d99dd4fe6f48f..e0f6069a7d28db60cde79f308f8a6799a8991f54 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-09  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/45894
+       * g++.dg/warn/Wsequence-point-2.C: New test.
+
 2010-11-09  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/46313
diff --git a/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C b/gcc/testsuite/g++.dg/warn/Wsequence-point-2.C
new file mode 100644 (file)
index 0000000..ab9c97a
--- /dev/null
@@ -0,0 +1,28 @@
+// PR c++/45894
+// { dg-do compile }
+// { dg-options "-std=c++0x -Wsequence-point" }
+
+struct F
+{
+  template <typename = int>
+  void bar ();
+};
+template <typename = int>
+struct V
+{
+  V (const V &) { F::bar <>; }
+};
+struct C
+{
+  V <> v;
+};
+struct B
+{
+  C f ();
+};
+struct A
+{
+  C c;
+  B b;
+  A () : c (b.f ()) { }
+};