re PR lto/85391 (ICE in add_type_duplicate, at ipa-devirt.c:1887)
authorJan Hubicka <jh@suse.cz>
Wed, 18 Apr 2018 11:29:26 +0000 (13:29 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 18 Apr 2018 11:29:26 +0000 (11:29 +0000)
PR lto/85391
* lto.c (lto_read_decls): Do not test TYPE_CANONICAL before registering odr
types.
* g++.dg/lto/pr83121_0.C: Update template.
* g++.dg/lto/pr83121_1.C: Update template.
* g++.dg/lto/pr84805_0.C: Update template.
* g++.dg/lto/pr84805_1.C: Update template.
* g++.dg/lto/pr84805_2.C: Update template.

Co-Authored-By: Martin Liska <mliska@suse.cz>
From-SVN: r259464

gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr83121_0.C
gcc/testsuite/g++.dg/lto/pr83121_1.C
gcc/testsuite/g++.dg/lto/pr84805_0.C
gcc/testsuite/g++.dg/lto/pr84805_1.C
gcc/testsuite/g++.dg/lto/pr84805_2.C

index d2b2511710ca3020cee60b64c8d02d3ba474bb53..fc0ecb7945052dcc67a40373a424d89af3238931 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-18  Jan Hubicka  <jh@suse.cz>
+           Martin Liska  <mliska@suse.cz>
+
+       PR lto/85391
+       * lto.c (lto_read_decls): Do not test TYPE_CANONICAL before registering odr
+       types.
+
 2018-04-11  Martin Liska  <mliska@suse.cz>
 
        * lto-symtab.c (lto_symtab_merge_p): Use attribute_value_equal
index 97266136aa084b3d15e6832d71571d83b9e6dabd..0099398ece905fc4696aa551fcc0bcaaf198a28d 100644 (file)
@@ -1772,12 +1772,13 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
                  seen_type = true;
                  num_prevailing_types++;
                  lto_fixup_prevailing_type (t);
-               }
-             /* Compute the canonical type of all types.
-                ???  Should be able to assert that !TYPE_CANONICAL.  */
-             if (TYPE_P (t) && !TYPE_CANONICAL (t))
-               {
-                 gimple_register_canonical_type (t);
+
+                 /* Compute the canonical type of all types.
+                    Because SCC components ar estreame in random (hash) order
+                    we may have enountered the type before while registering
+                    type canonical of a derived type in the same SCC.  */
+                 if (!TYPE_CANONICAL (t))
+                   gimple_register_canonical_type (t);
                  if (odr_type_p (t))
                    register_odr_type (t);
                }
index 8e2a0156f6ee39098547bd0536666f6dbc3512bf..179b4422ecf4451a85c585d238b63398fa50aa93 100644 (file)
@@ -1,3 +1,12 @@
+2018-04-18  Jan Hubicka  <jh@suse.cz>
+           Martin Liska  <mliska@suse.cz>
+
+       * g++.dg/lto/pr83121_0.C: Update template.
+       * g++.dg/lto/pr83121_1.C: Update template.
+       * g++.dg/lto/pr84805_0.C: Update template.
+       * g++.dg/lto/pr84805_1.C: Update template.
+       * g++.dg/lto/pr84805_2.C: Update template.
+
 2018-04-18  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/84630
index ef894c7c868999edf2efee98f222c290c062a110..358b55b8fbdd196ab2617770cc7091f6a6bdbb89 100644 (file)
@@ -4,8 +4,8 @@
    from being optimized away.  */
 
 struct Environment { // { dg-lto-warning "8: type 'struct Environment' violates the C\\+\\+ One Definition Rule" }
-  struct AsyncHooks {
-    int providers_[2]; // { dg-lto-message "a field of same name but different type is defined in another translation unit" }
+  struct AsyncHooks { // { dg-lto-warning "10: type 'struct AsyncHooks' violates the C\\+\\+ One Definition Rule" }
+    int providers_[2]; // { dg-lto-message "the first difference of corresponding definitions is field 'providers_'" }
   };
   AsyncHooks async_hooks_;
 };
index 2aef1b50957026ea7abd93ccf4a654c5c513b8b7..01b05f4e7622df74a26ee5dacf2b2cd3889c5fd2 100644 (file)
@@ -1,8 +1,8 @@
 struct Environment {
-  struct AsyncHooks { // { dg-lto-warning "10: type 'struct AsyncHooks' violates the C\\+\\+ One Definition Rule" }
-    int providers_[1]; // { dg-lto-message "the first difference of corresponding definitions is field 'providers_'" }
+  struct AsyncHooks {
+    int providers_[1];
   };
-  AsyncHooks async_hooks_;
+  AsyncHooks async_hooks_; // { dg-lto-message "a field of same name but different type is defined in another translation unit" }
 };
 void fn1() { Environment a; }
 int main ()
index c34c6340201c8d80282e2db03f2ff7744ead5075..34828043d2e67707371ac2e468a32599a65f0ff3 100644 (file)
@@ -1,5 +1,5 @@
 // { dg-lto-do link }
-// { dg-lto-options {{-O2 -fPIC -shared -flto}} }
+// { dg-lto-options {{-O0 -fPIC -shared -flto}} }
 
 template < typename _Tp, _Tp __v > struct integral_constant {
   static constexpr _Tp value = __v;
@@ -9,7 +9,7 @@ struct __is_void_helper : false_type {};
 struct is_void : __is_void_helper {};
 template < typename > struct is_array : false_type {};
 namespace __gnu_cxx {
-enum _Lock_policy { _S_single, _S_mutex, _S_atomic };
+enum _Lock_policy { _S_single, _S_mutex, _S_atomic }; // { dg-lto-warning "6: type '_Lock_policy' violates the C\\+\\+ One Definition Rule" }
 const _Lock_policy __default_lock_policy = _S_atomic;
 } namespace std {
 using __gnu_cxx::_Lock_policy;
@@ -21,7 +21,7 @@ template < typename _Tp, _Lock_policy, bool = is_array< _Tp >::value,
            bool = is_void::value >
 class __shared_ptr_access {};
 template < typename _Tp, _Lock_policy _Lp >
-class __shared_ptr : __shared_ptr_access< _Tp, _Lp > {
+class __shared_ptr : __shared_ptr_access< _Tp, _Lp > { // { dg-lto-warning "7: type 'struct __shared_ptr' violates the C\\+\\+ One Definition Rule" }
   using element_type = _Tp;
   element_type *_M_ptr;
   __shared_count< _Lp > _M_refcount;
@@ -88,7 +88,7 @@ class ExtNameBuff;
 class ExtSheetBuffer;
 class ExcelToSc;
 class XclImpColRowSettings;
-struct RootData {
+struct RootData { // { dg-lto-warning "8: type 'struct RootData' violates the C\\+\\+ One Definition Rule" }
   BiffTyp eDateiTyp;
   ExtSheetBuffer *pExtSheetBuff;
   SharedFormulaBuffer *pShrfmlaBuff;
index c59a37c5fc0a15aac40d2c4528332cb7c095cef8..2d8a45c001a8521bb81e9419184e997104d8e6fc 100644 (file)
@@ -3,7 +3,7 @@ public:
   virtual ~XclRoot();
 };
 class XclImpRoot : XclRoot {};
-struct RootData { // { dg-lto-warning "8: type 'struct RootData' violates the C\\+\\+ One Definition Rule" }
+struct RootData {
   XclImpRoot pIR;
 };
 class ExcRoot {
index a043dac66749bcc288ed85f721792a0e84eb7ded..a1c1a6a890154e057298dfbbec9408ff957062bb 100644 (file)
@@ -15,7 +15,7 @@ template < _Lock_policy > class __shared_count { _Sp_counted_base<> *_M_pi; };
 template < typename a, _Lock_policy, bool = g< a >::d, bool = t::d >
 class __shared_ptr_access {};
 template < typename a, _Lock_policy l >
-class __shared_ptr : __shared_ptr_access< a, l > { // { dg-lto-warning "7: type 'struct __shared_ptr' violates the C\\+\\+ One Definition Rule" }
+class __shared_ptr : __shared_ptr_access< a, l > {
   using m = a;
   m *_M_ptr;
   __shared_count< l > _M_refcount;