------- Comment #5 from rguenth at gcc dot gnu dot org 2010-07-10 11:21 ------- Somewhere down in type
0x7ffff57497e0 struct nsRefreshDriver 0x7ffff5964348 struct nsRefreshDriver (gdb) call debug_type_differences (0x7ffff57497e0, 0x7ffff5964348) Hashes differ. Field types not compatible. type 0x7ffff59fb690 struct nsPresContext * type 0x7ffff5af9d20 struct nsPresContext * field 0x7ffff574b688 mPresContext field 0x7ffff5941ab0 mPresContext Field types not compatible. type 0x7ffff574c150 struct nsTObserverArray[3] type 0x7ffff5964dc8 struct nsTObserverArray[3] field 0x7ffff574b7b8 mObservers field 0x7ffff5941be0 mObservers (gdb) call debug_type_differences (0x7ffff574c150, 0x7ffff5964dc8) Hashes differ. Because the array types have different size: <array_type 0x7ffff574c150 type <record_type 0x7ffff574c0a8 nsTObserverArray addressable needs-constructing BLK size <integer_cst 0x7ffff7ed3938 constant 128> unit size <integer_cst 0x7ffff7ed3960 constant 16> align 64 symtab 0 alias set -1 canonical type 0x7ffff574c0a8 fields <field_decl 0x7ffff574b850 D.11101 type <record_type 0x7ffff5749e70 nsAutoTObserverArray> ignored BLK file tc/nsCopySupport.3.ii line 2745 col 25 size <integer_cst 0x7ffff7ed3938 128> unit size <integer_cst 0x7ffff7ed3960 16> align 64 offset_align 128 offset <integer_cst 0x7ffff7ed3410 constant 0> bit offset <integer_cst 0x7ffff7ed3b18 constant 0> context <record_type 0x7ffff574c0a8 nsTObserverArray>>> needs-constructing BLK size <integer_cst 0x7ffff5b0e000 type <integer_type 0x7ffff7ee50a8 bit_size_type> constant 384> unit size <integer_cst 0x7ffff5af80f0 type <integer_type 0x7ffff7ee5000> constant 48> align 64 symtab 0 alias set -1 canonical type 0x7ffff574c150 domain <integer_type 0x7ffff59f1930 type <integer_type 0x7ffff7ee5000 public unsigned sizetype DI size <integer_cst 0x7ffff7ed37a8 constant 64> unit size <integer_cst 0x7ffff7ed37d0 constant 8> align 64 symtab 0 alias set -1 canonical type 0x7ffff7ee5000 precision 64 min <integer_cst 0x7ffff7ed37f8 0> max <integer_cst 0x7ffff7ed39b0 -1>> DI size <integer_cst 0x7ffff7ed37a8 64> unit size <integer_cst 0x7ffff7ed37d0 8> align 64 symtab 0 alias set -1 canonical type 0x7ffff59f1930 precision 64 min <integer_cst 0x7ffff7ed3410 0> max <integer_cst 0x7ffff7ed3618 2>>> <array_type 0x7ffff5964dc8 type <record_type 0x7ffff5b283f0 nsTObserverArray addressable needs-constructing BLK size <integer_cst 0x7ffff7ed3f28 constant 192> unit size <integer_cst 0x7ffff7ed3ed8 constant 24> align 64 symtab 0 alias set -1 canonical type 0x7ffff5b283f0 fields <field_decl 0x7ffff5b1cd10 D.2705 type <record_type 0x7ffff5b28498 nsAutoTObserverArray> ignored BLK file tc/nsContentUtils.3.3.ii line 3624 col 25 size <integer_cst 0x7ffff7ed3f28 192> unit size <integer_cst 0x7ffff7ed3ed8 24> align 64 offset_align 128 offset <integer_cst 0x7ffff7ed3410 constant 0> bit offset <integer_cst 0x7ffff7ed3b18 constant 0> context <record_type 0x7ffff5b283f0 nsTObserverArray>>> needs-constructing BLK size <integer_cst 0x7ffff5b0cf78 type <integer_type 0x7ffff7ee50a8 bit_size_type> constant 576> unit size <integer_cst 0x7ffff5b0e028 type <integer_type 0x7ffff7ee5000> constant 72> align 64 symtab 0 alias set -1 canonical type 0x7ffff5964dc8 domain <integer_type 0x7ffff59f1930 type <integer_type 0x7ffff7ee5000 public unsigned sizetype DI size <integer_cst 0x7ffff7ed37a8 constant 64> unit size <integer_cst 0x7ffff7ed37d0 constant 8> align 64 symtab 0 alias set -1 canonical type 0x7ffff7ee5000 precision 64 min <integer_cst 0x7ffff7ed37f8 0> max <integer_cst 0x7ffff7ed39b0 -1>> DI size <integer_cst 0x7ffff7ed37a8 64> unit size <integer_cst 0x7ffff7ed37d0 8> align 64 symtab 0 alias set -1 canonical type 0x7ffff59f1930 precision 64 min <integer_cst 0x7ffff7ed3410 0> max <integer_cst 0x7ffff7ed3618 2>>> because the array element types differ: (gdb) call debug_type_differences (0x7ffff574c0a8, 0x7ffff5b283f0) Hashes differ. Field types not compatible. type 0x7ffff5749e70 struct nsAutoTObserverArray type 0x7ffff5b28498 struct nsAutoTObserverArray field 0x7ffff574b850 D.11101 field 0x7ffff5b1cd10 D.2705 (gdb) call debug_type_differences (0x7ffff5749e70, 0x7ffff5b28498) Hashes differ. Field types not compatible. type 0x7ffff5749f18 struct nsAutoTArray type 0x7ffff5b28930 struct nsAutoTArray field 0x7ffff574b980 mArray field 0x7ffff5b2a098 mArray (gdb) call debug_type_differences (0x7ffff5749f18, 0x7ffff5b28930) Hashes differ. Different number of fields. Type decls: <type_decl 0x7ffff5933e60 nsAutoTArray type <record_type 0x7ffff5749f18 nsAutoTArray addressable needs-constructing BLK size <integer_cst 0x7ffff7ed37a8 constant 64> unit size <integer_cst 0x7ffff7ed37d0 constant 8> align 64 symtab 0 alias set -1 canonical type 0x7ffff5749f18 fields <field_decl 0x7ffff574ba18 D.11104 type <record_type 0x7ffff5bc03f0 nsTArray> ignored BLK file tc/nsCopySupport.3.ii line 2126 col 25 size <integer_cst 0x7ffff7ed37a8 64> unit size <integer_cst 0x7ffff7ed37d0 8> align 64 offset_align 128 offset <integer_cst 0x7ffff7ed3410 constant 0> bit offset <integer_cst 0x7ffff7ed3b18 constant 0> context <record_type 0x7ffff5749f18 nsAutoTArray>>> public BLK file tc/nsCopySupport.3.ii line 2106 col 37 align 8> and <type_decl 0x7ffff5b257e8 nsAutoTArray type <record_type 0x7ffff5b28930 nsAutoTArray addressable needs-constructing BLK size <integer_cst 0x7ffff7ed3938 constant 128> unit size <integer_cst 0x7ffff7ed3960 constant 16> align 64 symtab 0 alias set -1 canonical type 0x7ffff5b28930 fields <field_decl 0x7ffff5b2a130 D.2715 type <record_type 0x7ffff5bc03f0 nsTArray> ignored BLK file tc/nsContentUtils.3.3.ii line 1757 col 37 size <integer_cst 0x7ffff7ed37a8 constant 64> unit size <integer_cst 0x7ffff7ed37d0 constant 8> align 64 offset_align 128 offset <integer_cst 0x7ffff7ed3410 constant 0> bit offset <integer_cst 0x7ffff7ed3b18 constant 0> context <record_type 0x7ffff5b28930 nsAutoTArray> chain <field_decl 0x7ffff5b2a4c0 D.2725>>> public BLK file tc/nsContentUtils.3.3.ii line 1757 col 37 align 8> One type misses the protected union member (both sources are identical though): template<class E, PRUint32 N> class nsAutoTArray : public nsTArray<E> { public: typedef nsTArray<E> base_type; typedef typename base_type::Header Header; typedef typename base_type::elem_type elem_type; nsAutoTArray() { base_type::mHdr = reinterpret_cast<Header*>(&mAutoBuf); base_type::mHdr->mLength = 0; base_type::mHdr->mCapacity = N; base_type::mHdr->mIsAutoArray = 1; do { } while (0) ; } protected: union { char mAutoBuf[sizeof(Header) + N * sizeof(elem_type)]; PRUint64 dummy; }; }; One source misses the specialization for N == 0 (maybe an error of my reduction though). template<class E> class nsAutoTArray<E, 0> : public nsTArray<E> { public: nsAutoTArray() { } }; most definitely. :/ -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44894