re PR c++/27177 (ICE in build_simple_base_path, at cp/class.c:474)
authorJason Merrill <jason@redhat.com>
Mon, 28 Jan 2008 02:19:38 +0000 (21:19 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 28 Jan 2008 02:19:38 +0000 (21:19 -0500)
        PR c++/27177
        * class.c (build_base_path): Fix previous change.

From-SVN: r131899

gcc/cp/ChangeLog
gcc/cp/class.c

index 714f65b1208d5098b68023e1029269faf13c6b3b..118d25d8f56de5670254a6c3475fa963d9ea630c 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-27  Jason Merrill  <jason@redhat.com>
+
+       PR c++/27177
+       * class.c (build_base_path): Fix previous change.
+
 2008-01-26  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/34965
index 6b76bf7477fda6b28dd8e6273f3093b38f9cbc8a..0ce4ba499905200716eb0d66730c5558311633bf 100644 (file)
@@ -291,8 +291,12 @@ build_base_path (enum tree_code code,
   target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo);
 
   /* Do we need to look in the vtable for the real offset?  */
-  /* Don't bother inside sizeof; the source type might not be complete.  */
-  virtual_access = (v_binfo && fixed_type_p <= 0) && !skip_evaluation;
+  virtual_access = (v_binfo && fixed_type_p <= 0);
+
+  /* Don't bother with the calculations inside sizeof; they'll ICE if the
+     source type is incomplete and the pointer value doesn't matter.  */
+  if (skip_evaluation)
+    return build_nop (build_pointer_type (target_type), expr);
 
   /* Do we need to check for a null pointer?  */
   if (want_pointer && !nonnull)