diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 472519c7e3e..541a2c7610c 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,5 +1,8 @@ 2019-12-18 Thomas Schwinge + * target.c (gomp_unmap_vars_internal): Add a safeguard to + 'gomp_remove_var'. + * target.c (gomp_to_device_kind_p): Handle 'GOMP_MAP_FORCE_FROM' like 'GOMP_MAP_FROM'. diff --git a/libgomp/target.c b/libgomp/target.c index a3cdb34bd51..67cd80a3c35 100644 --- a/libgomp/target.c +++ b/libgomp/target.c @@ -1225,7 +1225,15 @@ gomp_unmap_vars_internal (struct target_mem_desc *tgt, bool do_copyfrom, + tgt->list[i].offset), tgt->list[i].length); if (do_unmap) - gomp_remove_var (devicep, k); + { + struct target_mem_desc *k_tgt = k->tgt; + bool is_tgt_unmapped = gomp_remove_var (devicep, k); + /* It would be bad if TGT got unmapped while we're still iterating + over its LIST_COUNT, and also expect to use it in the following + code. */ + assert (!is_tgt_unmapped + || k_tgt != tgt); + } } if (aq)