For such an heap insert, we will pass the actual value of column to index_form_tuple during index insert. However during recheck when we fetch the value of c2 from heap tuple and pass it index tuple, the value is already in compressed form and index_form_tuple might again try to compress it because the size will still be greater than TOAST_INDEX_TARGET and if it does so, it might make recheck fail.
Would it? I thought "if (!VARATT_IS_EXTENDED(DatumGetPointer(untoasted_values[i]))" check should prevent that. But I could be reading those macros wrong. They are probably heavily uncommented and it's not clear what each of those VARATT_* macro do.