Commit 7d6051b1 by Jan Hubicka Committed by Jan Hubicka

re PR lto/85391 (ICE in add_type_duplicate, at ipa-devirt.c:1887)


	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
parent 8cc8789f
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> 2018-04-11 Martin Liska <mliska@suse.cz>
* lto-symtab.c (lto_symtab_merge_p): Use attribute_value_equal * lto-symtab.c (lto_symtab_merge_p): Use attribute_value_equal
......
...@@ -1772,12 +1772,13 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data, ...@@ -1772,12 +1772,13 @@ lto_read_decls (struct lto_file_decl_data *decl_data, const void *data,
seen_type = true; seen_type = true;
num_prevailing_types++; num_prevailing_types++;
lto_fixup_prevailing_type (t); lto_fixup_prevailing_type (t);
}
/* Compute the canonical type of all types. /* Compute the canonical type of all types.
??? Should be able to assert that !TYPE_CANONICAL. */ Because SCC components ar estreame in random (hash) order
if (TYPE_P (t) && !TYPE_CANONICAL (t)) we may have enountered the type before while registering
{ type canonical of a derived type in the same SCC. */
gimple_register_canonical_type (t); if (!TYPE_CANONICAL (t))
gimple_register_canonical_type (t);
if (odr_type_p (t)) if (odr_type_p (t))
register_odr_type (t); register_odr_type (t);
} }
......
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> 2018-04-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84630 PR c++/84630
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
from being optimized away. */ from being optimized away. */
struct Environment { // { dg-lto-warning "8: type 'struct Environment' violates the C\\+\\+ One Definition Rule" } struct Environment { // { dg-lto-warning "8: type 'struct Environment' violates the C\\+\\+ One Definition Rule" }
struct AsyncHooks { struct AsyncHooks { // { dg-lto-warning "10: type 'struct AsyncHooks' violates the C\\+\\+ One Definition Rule" }
int providers_[2]; // { dg-lto-message "a field of same name but different type is defined in another translation unit" } int providers_[2]; // { dg-lto-message "the first difference of corresponding definitions is field 'providers_'" }
}; };
AsyncHooks async_hooks_; AsyncHooks async_hooks_;
}; };
......
struct Environment { struct Environment {
struct AsyncHooks { // { dg-lto-warning "10: type 'struct AsyncHooks' violates the C\\+\\+ One Definition Rule" } struct AsyncHooks {
int providers_[1]; // { dg-lto-message "the first difference of corresponding definitions is field 'providers_'" } 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; } void fn1() { Environment a; }
int main () int main ()
......
// { dg-lto-do link } // { 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 { template < typename _Tp, _Tp __v > struct integral_constant {
static constexpr _Tp value = __v; static constexpr _Tp value = __v;
...@@ -9,7 +9,7 @@ struct __is_void_helper : false_type {}; ...@@ -9,7 +9,7 @@ struct __is_void_helper : false_type {};
struct is_void : __is_void_helper {}; struct is_void : __is_void_helper {};
template < typename > struct is_array : false_type {}; template < typename > struct is_array : false_type {};
namespace __gnu_cxx { 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; const _Lock_policy __default_lock_policy = _S_atomic;
} namespace std { } namespace std {
using __gnu_cxx::_Lock_policy; using __gnu_cxx::_Lock_policy;
...@@ -21,7 +21,7 @@ template < typename _Tp, _Lock_policy, bool = is_array< _Tp >::value, ...@@ -21,7 +21,7 @@ template < typename _Tp, _Lock_policy, bool = is_array< _Tp >::value,
bool = is_void::value > bool = is_void::value >
class __shared_ptr_access {}; class __shared_ptr_access {};
template < typename _Tp, _Lock_policy _Lp > 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; using element_type = _Tp;
element_type *_M_ptr; element_type *_M_ptr;
__shared_count< _Lp > _M_refcount; __shared_count< _Lp > _M_refcount;
...@@ -88,7 +88,7 @@ class ExtNameBuff; ...@@ -88,7 +88,7 @@ class ExtNameBuff;
class ExtSheetBuffer; class ExtSheetBuffer;
class ExcelToSc; class ExcelToSc;
class XclImpColRowSettings; class XclImpColRowSettings;
struct RootData { struct RootData { // { dg-lto-warning "8: type 'struct RootData' violates the C\\+\\+ One Definition Rule" }
BiffTyp eDateiTyp; BiffTyp eDateiTyp;
ExtSheetBuffer *pExtSheetBuff; ExtSheetBuffer *pExtSheetBuff;
SharedFormulaBuffer *pShrfmlaBuff; SharedFormulaBuffer *pShrfmlaBuff;
......
...@@ -3,7 +3,7 @@ public: ...@@ -3,7 +3,7 @@ public:
virtual ~XclRoot(); virtual ~XclRoot();
}; };
class XclImpRoot : XclRoot {}; class XclImpRoot : XclRoot {};
struct RootData { // { dg-lto-warning "8: type 'struct RootData' violates the C\\+\\+ One Definition Rule" } struct RootData {
XclImpRoot pIR; XclImpRoot pIR;
}; };
class ExcRoot { class ExcRoot {
......
...@@ -15,7 +15,7 @@ template < _Lock_policy > class __shared_count { _Sp_counted_base<> *_M_pi; }; ...@@ -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 > template < typename a, _Lock_policy, bool = g< a >::d, bool = t::d >
class __shared_ptr_access {}; class __shared_ptr_access {};
template < typename a, _Lock_policy l > 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; using m = a;
m *_M_ptr; m *_M_ptr;
__shared_count< l > _M_refcount; __shared_count< l > _M_refcount;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment