https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79821
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to r...@cebitec.uni-bielefeld.de from comment #6) > > --- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- > > If you up from the ICE case up to gt_pch_nx_die_struct frame, it would be > > interesting if you can figure out what x is would be print_die (x, stderr) > > I get > > DIE 0: DW_TAG_member (f821cdb0) > abbrev id: 0 offset: 0 mark: 0 > DW_AT_name: "is_specialized" > DW_AT_decl_file: > "/var/gcc/reghunt/pch-segv/36684/sparc-sun-solaris2.12/sparcv9/libstdc++-v3/ > include/limits" (0) > DW_AT_decl_line: 385 > DW_AT_type: die -> 0 (fb6a4c60) > DW_AT_external: 1 > DW_AT_declaration: 1 > DW_AT_const_value: floating-point or vector constant > DW_AT_const_expr: 1 > > for the innermost call to gt_pch_nx_die_struct. Ah, so it will be most likely that DW_AT_const_value: floating-point or vector constant We have: dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec; and struct GTY(()) dw_vec_const { unsigned char * GTY((atomic)) array; unsigned length; unsigned elt_size; }; If we are calling strlen on that array, that is obviously incorrect, because the array contains random bytes. We need some way to tell GC that the array has length * elt_size size.