[patch] PR lto/65276 remove odr_violated assert

Aldy Hernandez aldyh@redhat.com
Mon Mar 2 18:43:00 GMT 2015


TYPE_BINFO is null when no optimization is used, but odr_violated is unset.

Fixed and approved in the PR by Honza.

Tested on x86-64 Linux.

Committed to mainline.
-------------- next part --------------
commit a26ff3a2376a898bef8ca8ab17a457052d677a62
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Mon Mar 2 09:55:28 2015 -0800

    	PR lto/65276
    	* ipa-devirt.c (add_type_duplicate): Remove odr_violated assert
    	when checking TYPE_BINFO.

diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index c3f8b15..fe29932 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -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
index 0000000..c8e9699
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr65276_0.C
@@ -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
index 0000000..ee49752
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr65276_1.C
@@ -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;
+}


More information about the Gcc-patches mailing list