re PR lto/65276 (LTO: ICE add_type_duplicate, at ipa-devirt.c:1462)
authorJan Hubicka <hubicka@ucw.cz>
Mon, 2 Mar 2015 18:43:56 +0000 (19:43 +0100)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Mon, 2 Mar 2015 18:43:56 +0000 (18:43 +0000)
PR lto/65276
* ipa-devirt.c (add_type_duplicate): Remove odr_violated assert
when checking TYPE_BINFO.

Co-Authored-By: Aldy Hernandez <aldyh@redhat.com>
From-SVN: r221121

gcc/ChangeLog
gcc/ipa-devirt.c
gcc/testsuite/g++.dg/lto/pr65276_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/pr65276_1.C [new file with mode: 0644]

index 862f83901155ae4b578ef951227c91400ba7f1fe..da14db851574a406a25c7534e6bc16c1d243dade 100644 (file)
@@ -1,3 +1,10 @@
+2015-03-02  Jan Hubicka  <hubicka@ucw.cz>
+           Aldy Hernandez  <aldyh@redhat.com>
+
+       PR lto/65276
+       * ipa-devirt.c (add_type_duplicate): Remove odr_violated assert
+       when checking TYPE_BINFO.
+
 2015-03-02  Richard Biener  <rguenther@suse.de>
 
        PR ipa/65270
index c3f8b156a55f201221c16008431f8ed2145dcf41..fe29932c3e0efb64f43b44b723d6b5a333a579dd 100644 (file)
@@ -1459,7 +1459,6 @@ add_type_duplicate (odr_type val, tree type)
                        && polymorphic_type_binfo_p (TYPE_BINFO (type1))
                           != polymorphic_type_binfo_p (TYPE_BINFO (type2))))
                  {
-                   gcc_assert (val->odr_violated);
                    base_mismatch = true;
                    break;
                  }
diff --git a/gcc/testsuite/g++.dg/lto/pr65276_0.C b/gcc/testsuite/g++.dg/lto/pr65276_0.C
new file mode 100644 (file)
index 0000000..c8e9699
--- /dev/null
@@ -0,0 +1,61 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-flto -O0 -std=c++11}} }
+
+/* pr65276_0.C should get compiled with -O0, while the _1.C file
+   should get compiled with -O2, and the entire thing should be linked
+   with -O0.  Test that we don't get an ICE.  */
+
+extern "C++"
+{
+  namespace std
+  {
+    class exception
+    {
+    public:
+      virtual ~ exception () noexcept;
+    };
+  }
+}
+namespace std
+{
+  struct __cow_string
+  {
+    union
+    {
+      const char *_M_p;
+      char _M_bytes[sizeof (const char *)];
+    };
+  };
+  class runtime_error:public exception
+  {
+    __cow_string _M_msg;
+  };
+}
+namespace std
+{
+  class system_error:public std::runtime_error
+  {
+  };
+  enum _Ios_Fmtflags
+  {
+  };
+  inline constexpr _Ios_Fmtflags operator& (_Ios_Fmtflags __a,
+                                            _Ios_Fmtflags __b)
+  {
+    return _Ios_Fmtflags ();
+  }
+  enum _Ios_Openmode
+  {
+  };
+  class ios_base
+  {
+  public:
+    class __attribute ((__abi_tag__ ("cxx11"))) failure:public system_error
+    {
+    };
+    class Init
+    {
+    };
+  };
+  static ios_base::Init __ioinit;
+}
diff --git a/gcc/testsuite/g++.dg/lto/pr65276_1.C b/gcc/testsuite/g++.dg/lto/pr65276_1.C
new file mode 100644 (file)
index 0000000..ee49752
--- /dev/null
@@ -0,0 +1,34 @@
+// { dg-options "-O2" }
+#pragma implementation
+#pragma interface
+extern "C++"
+{
+  namespace std
+  {
+    class exception
+    {
+    public:
+      virtual ~ exception () noexcept;
+    };
+  }
+}
+namespace std
+{
+  struct __cow_string
+  {
+    union
+    {
+      const char *_M_p;
+      char _M_bytes[sizeof (const char *)];
+    };
+  };
+  class runtime_error:public exception
+  {
+    __cow_string _M_msg;
+  };
+}
+
+int main()
+{
+  return 0;
+}