From 45e27999b9eae987ce85ee1e78643445b97a4126 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Wed, 30 Nov 2022 22:02:12 +0000 Subject: [PATCH] Improve error message for qualified expression type check --- src/diag.c | 1 + src/sem.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/diag.c b/src/diag.c index be26eef7..b4787e34 100644 --- a/src/diag.c +++ b/src/diag.c @@ -346,6 +346,7 @@ static const struct { [STD_08] = "14.4" } }, { "Process statement", { [STD_93] = "9.2", [STD_08] = "11.3" } }, { "Entity statement part", { [STD_93] = "1.1.3", [STD_08] = "3.2.4" } }, + { "Qualified expressions", { [STD_08] = "9.3.5" } }, }; diag_t *diag_new(diag_level_t level, const loc_t *loc) diff --git a/src/sem.c b/src/sem.c index f0bbf1b0..512a85f9 100644 --- a/src/sem.c +++ b/src/sem.c @@ -3699,9 +3699,16 @@ static bool sem_check_qualified(tree_t t, nametab_t *tab) // LRM 08 section 9.3.5 qualified expressions: the operand shall have // the same type as the base type of the type mark type_t base = type_base_recur(tree_type(t)); - if (!sem_check_type(value, base)) - sem_error(value, "operand of qualified expression must have type %s", - type_pp(base)); + if (!sem_check_type(value, base)) { + diag_t *d = diag_new(DIAG_ERROR, tree_loc(value)); + diag_printf(d, "operand of qualified expression must have type %s", + type_pp(base)); + diag_hint(d, tree_loc(value), "operand has type %s", + type_pp(tree_type(value))); + diag_lrm(d, STD_08, "9.3.5"); + diag_emit(d); + return false; + } } return true; -- 2.39.2