This is a fix for a problem reported today to the mailing list. In check_assignment_types(), the first 'level' is checked by the function itself but the next level is checked by the type_difference(). This later function take as arguments, beside the types to be checked, the modifiers that can be assumed for each of the types (this works as a kind of reverse mask). But these modifiers are taken from target_qualifiers() which, purposely ignore the modifiers for arrays introduced in commit 984b7b66457c ("[PATCH] deal correctly with qualifiers on arrays") with the comment: "Pointers to any array are considered as pointers to unqualified type as far as implicit conversions are concerned" But by dropping these modifiers, type_difference() reports incorrect results for pointers to qualified arrays. So, do not use target_qualifiers() but take the modifiers directly from the ctypes. Admittingly, I'm far from sure that this is the right fix but it solve several wrong cases. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- evaluate.c | 4 ++-- validation/eval/array-quals0.c | 1 - validation/eval/array-quals1.c | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/evaluate.c b/evaluate.c index f515ce6f2de6..dddea76182ad 100644 --- a/evaluate.c +++ b/evaluate.c @@ -1444,8 +1444,8 @@ static int check_assignment_types(struct symbol *target, struct expression **rp, } b1 = examine_pointer_target(t); b2 = examine_pointer_target(s); - mod1 = target_qualifiers(t); - mod2 = target_qualifiers(s); + mod1 = t->ctype.modifiers & MOD_IGN; + mod2 = s->ctype.modifiers & MOD_IGN; if (whitelist_pointers(b1, b2)) { /* * assignments to/from void * are OK, provided that diff --git a/validation/eval/array-quals0.c b/validation/eval/array-quals0.c index 9cb08c1722d7..30727490289e 100644 --- a/validation/eval/array-quals0.c +++ b/validation/eval/array-quals0.c @@ -3,5 +3,4 @@ static const int (*p)[3] = a; /* * check-name: array-quals0 - * check-known-to-fail */ diff --git a/validation/eval/array-quals1.c b/validation/eval/array-quals1.c index a1c3905826d5..d3e54f3ec8dc 100644 --- a/validation/eval/array-quals1.c +++ b/validation/eval/array-quals1.c @@ -25,7 +25,6 @@ static void *const ko_vi__a = &vi__a; /* * check-name: array-quals1 - * check-known-to-fail * * check-error-start eval/array-quals1.c:12:38: warning: incorrect type in initializer (different modifiers) -- 2.27.0