]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Jan 2014 16:22:53 +0000 (16:22 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 31 Jan 2014 16:22:53 +0000 (16:22 +0000)
2014-01-31  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/59082
* class.c (build_vfield_ref): Early return error_mark_node if
TYPE_VFIELD (type) is null.
(build_base_path): Check return value of build_vfield_ref.

/testsuite
2014-01-31  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/59082
* g++.dg/inherit/crash4.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@207359 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/crash4.C [new file with mode: 0644]

index 1fd5a6808d8592cf23985a6e33847b5b92dd030f..0909bf1441711f20f845e25a88671f4f3b931436 100644 (file)
@@ -1,3 +1,10 @@
+2014-01-31  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/59082
+       * class.c (build_vfield_ref): Early return error_mark_node if
+       TYPE_VFIELD (type) is null.
+       (build_base_path): Check return value of build_vfield_ref.
+
 2014-01-31  Jason Merrill  <jason@redhat.com>
 
        PR c++/59646
index 0c3ce47bc756be930d768cdc2d8b5b423285fde7..97a1cc27855c144d7ea96593e9f50c46e2796fbe 100644 (file)
@@ -431,6 +431,9 @@ build_base_path (enum tree_code code,
        v_offset = build_vfield_ref (cp_build_indirect_ref (expr, RO_NULL,
                                                             complain),
                                     TREE_TYPE (TREE_TYPE (expr)));
+      
+      if (v_offset == error_mark_node)
+       return error_mark_node;
 
       v_offset = fold_build_pointer_plus (v_offset, BINFO_VPTR_FIELD (v_binfo));
       v_offset = build1 (NOP_EXPR,
@@ -625,7 +628,9 @@ build_vfield_ref (tree datum, tree type)
 {
   tree vfield, vcontext;
 
-  if (datum == error_mark_node)
+  if (datum == error_mark_node
+      /* Can happen in case of duplicate base types (c++/59082).  */
+      || !TYPE_VFIELD (type))
     return error_mark_node;
 
   /* First, convert to the requested type.  */
index c81b82d2dc565893dfb50ea7d200f09ec174e8dd..fca54d7cd30f11ca2ae40c9a7f55ecc032d94f01 100644 (file)
@@ -1,4 +1,10 @@
+2014-01-31  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/59082
+       * g++.dg/inherit/crash4.C: New.
+
 2014-01-31  Maxim Ostapenko  <m.ostapenko@partner.samsung.com>
+
        * c-c++-common/tsan/simple_race.c: Made test less flaky.
 
 2014-01-31  Ilya Tocar  <ilya.tocar@intel.com>
diff --git a/gcc/testsuite/g++.dg/inherit/crash4.C b/gcc/testsuite/g++.dg/inherit/crash4.C
new file mode 100644 (file)
index 0000000..b5b02f1
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/59082
+
+struct A {};
+
+struct B : virtual A, A {};  // { dg-error "duplicate base type" }
+
+A foo(const B &b)
+{
+  return b;
+}