From c8f2dc0dc967222673d71a0493958a587c53ae3c Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Sun, 29 Jul 2018 22:14:33 +0100 Subject: [PATCH] gdb: Fix sizeof for dynamic types other than arrays In commit: commit 37cc0caeca4c9a8552370040f4cfeaeceaa03369 Date: Wed Jul 18 13:38:35 2018 +0200 [gdb/exp] Interpret size of vla with unknown size as All dynamic types are treated as arrays in the 'sizeof' code path, which means that structures can incorrectly be treated as arrays. This can cause a failure in the gdb.base/vla-datatypes.exp test script. This commit adds a check that we do have an array before checking the array bounds, and I also check that the array index type is dynamic too. This second check probably isn't strictly necessary, but shouldn't hurt, a non-dynamic index type shouldn't have undefined high bound. gdb/ChangeLog: * eval.c (evaluate_subexp_for_sizeof): Check for array type before checking array bounds are defined. --- gdb/ChangeLog | 5 +++++ gdb/eval.c | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 24ffeecda11..6d5b24c1e11 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-07-30 Andrew Burgess + + * eval.c (evaluate_subexp_for_sizeof): Check for array type before + checking array bounds are defined. + 2018-07-30 Tom Tromey * nat/linux-osdata.c (pid_pgid_entry::operator<): Fix diff --git a/gdb/eval.c b/gdb/eval.c index 0495a11bfd7..2e08e9355f5 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -3145,7 +3145,9 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos, { val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_NORMAL); type = value_type (val); - if (TYPE_HIGH_BOUND_UNDEFINED (TYPE_INDEX_TYPE (type))) + if (TYPE_CODE (type) == TYPE_CODE_ARRAY + && is_dynamic_type (TYPE_INDEX_TYPE (type)) + && TYPE_HIGH_BOUND_UNDEFINED (TYPE_INDEX_TYPE (type))) return allocate_optimized_out_value (size_type); } else -- 2.30.2