https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70594
--- Comment #30 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Ah, the reason is clear, hash_table<named_label_hasher> *x_named_labels; hashes based on DECL_UID (that is fine), and adds the labels during hash table traversal (which is not fine). Both: static void pop_labels (tree block) { if (named_labels) { named_labels->traverse<tree, pop_labels_1> (block); named_labels = NULL; } } and poplevel's if (cfun && !functionbody && named_labels) named_labels->traverse<cp_binding_level *, poplevel_named_label_1> (current_binding_level); look wrong in this regard.