[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