re PR c++/60218 ([c++11] ICE using __bases for broken class hierarchy)
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 9 Dec 2015 16:59:26 +0000 (16:59 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 9 Dec 2015 16:59:26 +0000 (16:59 +0000)
/cp
2015-12-09  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60218
* semantics.c (calculate_bases_helper): Don't call dfs_walk_all
when TYPE_BINFO (type) is null.
(calculate_bases): Handle gracefully a null vector->length ().

/testsuite
2015-12-09  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60218
* g++.dg/ext/bases2.C: New.

From-SVN: r231460

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/bases2.C [new file with mode: 0644]

index ac41ca655c5956c9f0c5de0abad23e6b01ad44ed..e8bcba51162f427cce89b989806d5ebd58f51887 100644 (file)
@@ -1,3 +1,10 @@
+2015-12-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60218
+       * semantics.c (calculate_bases_helper): Don't call dfs_walk_all
+       when TYPE_BINFO (type) is null.
+       (calculate_bases): Handle gracefully a null vector->length ().
+
 2015-12-08  Martin Sebor  <msebor@redhat.com>
 
        PR c++/68711
index 80d1b10ddad321feae86451aebdebc9cf0687b4e..b8f4e8f7ce73081c52bbf6ca6236cb974bddbc74 100644 (file)
@@ -3851,8 +3851,9 @@ calculate_bases_helper (tree type)
   vec<tree, va_gc> *vector = make_tree_vector();
 
   /* Now add non-virtual base classes in order of construction */
-  dfs_walk_all (TYPE_BINFO (type),
-                dfs_calculate_bases_pre, dfs_calculate_bases_post, &vector);
+  if (TYPE_BINFO (type))
+    dfs_walk_all (TYPE_BINFO (type),
+                 dfs_calculate_bases_pre, dfs_calculate_bases_post, &vector);
   return vector;
 }
 
@@ -3886,13 +3887,18 @@ calculate_bases (tree type)
   vec_safe_splice (vector, nonvbases);
   release_tree_vector (nonvbases);
 
-  /* Last element is entire class, so don't copy */
-  bases_vec = make_tree_vec (vector->length () - 1);
-
-  for (i = 0; i < vector->length () - 1; ++i)
+  /* Note that during error recovery vector->length can even be zero.  */
+  if (vector->length () > 1)
     {
-      TREE_VEC_ELT (bases_vec, i) = (*vector)[i];
+      /* Last element is entire class, so don't copy */
+      bases_vec = make_tree_vec (vector->length() - 1);
+
+      for (i = 0; i < vector->length () - 1; ++i)
+       TREE_VEC_ELT (bases_vec, i) = (*vector)[i];
     }
+  else
+    bases_vec = make_tree_vec (0);
+
   release_tree_vector (vector);
   return bases_vec;
 }
index d545bcbeacdb6ed881fc984881f86bb7dfd1aa28..20f62afa684c2252a1f841950cd9297c1bddbb85 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60218
+       * g++.dg/ext/bases2.C: New.
+
 2015-12-09  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/i386/sse4_1-roundps-1.c: Remove ASM_SUFFIX define.
diff --git a/gcc/testsuite/g++.dg/ext/bases2.C b/gcc/testsuite/g++.dg/ext/bases2.C
new file mode 100644 (file)
index 0000000..a8806dd
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/60218
+// { dg-do compile { target c++11 } }
+
+template<typename...> struct A {};
+
+template<typename T> struct B
+{
+  typedef A<__bases(T)...> C;
+};
+
+struct X {};
+struct Y : X* {};  // { dg-error "expected" }
+
+B<Y> b;