]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/51029 ([C++0x] [4.7 Regression] ICE with -std=c++0x)
authorJason Merrill <jason@redhat.com>
Wed, 9 Nov 2011 18:13:09 +0000 (13:13 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 9 Nov 2011 18:13:09 +0000 (13:13 -0500)
PR c++/51029
* class.c (build_base_path): Don't ICE in fold_non_dependent_expr.

From-SVN: r181225

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

index cba11e1374c5948ad92a71c00febb5e2440ca373..9c5a2bcc142f4b3eb5601b4bfb466cecaa6b7b2d 100644 (file)
@@ -1,5 +1,8 @@
 2011-11-09  Jason Merrill  <jason@redhat.com>
 
+       PR c++/51029
+       * class.c (build_base_path): Don't ICE in fold_non_dependent_expr.
+
        * Make-lang.in (check_g++_parallelize): Add dg-torture.exp.
        (check-c++0x): Obsolete.
 
index f10a749032d634ab894171c6721d6bff2b6e46b3..d2cf63c7d0f51e992d91d251c799a3b813d7fbf8 100644 (file)
@@ -359,6 +359,11 @@ 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 cff301e427dc8d442bca50ecea9ac9728b821734..e4ec7ae559df1b3e476e85e820a16cdb61eff70e 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-09  Jason Merrill  <jason@redhat.com>
+
+       PR c++/51029
+       * g++.dg/template/virtual1.C: New.
+
 2011-11-08  Jason Merrill  <jason@redhat.com>
 
        Run most C++ tests in both C++98 and C++11 modes.
diff --git a/gcc/testsuite/g++.dg/template/virtual1.C b/gcc/testsuite/g++.dg/template/virtual1.C
new file mode 100644 (file)
index 0000000..ee86bf3
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/51029
+
+struct A
+{
+  void foo();
+};
+
+struct B : virtual A
+{
+  template<int> B()
+  {
+    foo();
+  }
+};