https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84684
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- In the debugger when looking at cxx_eval_call_expression union_composition<0, dna4>::value_to_char_helper<4, dna4> (TARGET_EXPR <D.34562, {}>); I see: (gdb) p debug_generic_stmt (result) {._M_elems={65, 67, 67, 84}} which is 'A', 'C', 'C', 'T'. When doing cxx_eval_call_expression for the 3rd invocation of: to_char<dna4> (TARGET_EXPR <D.34725, *(const struct dna4 &) dna4::assign_rank (&alphabet, (int) (uint8_t) i)>); (i.e. when alphabet PARM_DECL has the current value of {._value=2}), we somehow find it in the hash table: 1598 constexpr_call *entry = NULL; 1599 if (depth_ok && !non_constant_args && ctx->strict) 1600 { 1601 new_call.hash = iterative_hash_template_arg 1602 (new_call.bindings, constexpr_fundef_hasher::hash (new_call.fundef)); 1603 1604 /* If we have seen this call before, we are done. */ 1605 maybe_initialize_constexpr_call_table (); 1606 constexpr_call **slot 1607 = constexpr_call_table->find_slot (&new_call, INSERT); 1608 entry = *slot; (i.e. entry is non-NULL) and actually use the cached result instead of evaluating it again. debug_tree (new_call.bindings) <tree_list 0x7fffee728780 purpose <parm_decl 0x7fffee712a00 alph type <record_type 0x7fffee6d8738 dna4 readonly type_5 QI size <integer_cst 0x7fffefc45f60 constant 8> unit-size <integer_cst 0x7fffefc45f78 constant 1> align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 0x7fffee6d8738 fields <function_decl 0x7fffee713a00 __ct > context <translation_unit_decl 0x7fffefc52168 pr84684-7.ii> full-name "const struct dna4" X() X(constX&) this=(X&) n_parents=0 use_template=0 interface-unknown pointer_to_this <pointer_type 0x7fffee6d8888> reference_to_this <reference_type 0x7fffee714540>> readonly addressable used read QI pr84684-6.C:5:44 size <integer_cst 0x7fffefc45f60 8> unit-size <integer_cst 0x7fffefc45f78 1> align:8 warn_if_not_align:0 context <function_decl 0x7fffee713300 to_char> arg-type <record_type 0x7fffee6d8738 dna4>> value <constructor 0x7fffee727468 type <record_type 0x7fffee6d8738 dna4> constant length:1 idx <field_decl 0x7fffee6d45f0 _value type <integer_type 0x7fffef1a41f8 uint8_t> used unsigned nonlocal decl_3 QI pr84684-6.C:67:11 size <integer_cst 0x7fffefc45f60 8> unit-size <integer_cst 0x7fffefc45f78 1> align:8 warn_if_not_align:0 offset_align 128 offset <integer_cst 0x7fffefc45ea0 constant 0> bit-offset <integer_cst 0x7fffefc45ee8 constant 0> context <record_type 0x7fffee6d8540 dna4> chain <type_decl 0x7fffee6d4558 dna4>> val <integer_cst 0x7fffee727438 constant 2>>>