re PR c++/51137 ([C++0x] [4.7 Regression] ICE with -std=c++0x and virtual inheritance)
authorJason Merrill <jason@redhat.com>
Thu, 17 Nov 2011 16:34:59 +0000 (11:34 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 17 Nov 2011 16:34:59 +0000 (11:34 -0500)
PR c++/51137
* class.c (build_base_path): Don't do calculation in templates.

From-SVN: r181444

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

index 4e5b26523e18693a2b998f643cddd87afa93ae90..3807f9a907a4d1c0f329da64bafa272b62dc5240 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/51137
+       * class.c (build_base_path): Don't do calculation in templates.
+
 2011-11-15  Torvald Riegel  <triegel@redhat.com>
 
        * parser.c (cp_parser_transaction_expression): Require parentheses
index 4a291acca8ac0886ee75cc712cd7439371d63b39..0765817aed3fd35ea3d7c61f709477070ac4ec6a 100644 (file)
@@ -304,8 +304,13 @@ build_base_path (enum tree_code code,
   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 (cp_unevaluated_operand != 0)
+     source type is incomplete and the pointer value doesn't matter.  In a
+     template (even in fold_non_dependent_expr), we don't have vtables set
+     up properly yet, and the value doesn't matter there either; we're just
+     interested in the result of overload resolution.  */
+  if (cp_unevaluated_operand != 0
+      || (current_function_decl
+         && uses_template_parms (current_function_decl)))
     {
       expr = build_nop (ptr_target_type, expr);
       if (!want_pointer)
@@ -359,11 +364,6 @@ build_base_path (enum tree_code code,
         V_BINFO.  That offset is an entry in D_BINFO's vtable.  */
       tree v_offset;
 
-      /* In a constructor template, current_in_charge_parm isn't set,
-        and we might end up here via fold_non_dependent_expr.  */
-      if (fixed_type_p < 0 && !(cfun && current_in_charge_parm))
-       fixed_type_p = 0;
-
       if (fixed_type_p < 0 && in_base_initializer)
        {
          /* In a base member initializer, we cannot rely on the
index f345882e676ad81da0ddf064e7f5de394a47e467..0aaaaaf7ed3f674dac4c6e0df658513fb84852cd 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/51137
+       * g++.dg/template/virtual2.C: New.
+
 2011-11-17  Michael Matz  <matz@suse.de>
 
        PR middle-end/50644
diff --git a/gcc/testsuite/g++.dg/template/virtual2.C b/gcc/testsuite/g++.dg/template/virtual2.C
new file mode 100644 (file)
index 0000000..83b7ed6
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/51137
+
+struct A {};
+
+template<int> struct B : virtual A
+{
+  void foo()
+  {
+    (new A(*this))->A::~A();
+  }
+};