From 84a335eb4f9641a471184d86900609dd97215218 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 22 Nov 2024 20:33:10 +0000 Subject: c: Fix typeof_unqual handling of qualified array types [PR112841] As reported in bug 112841, typeof_unqual fails to remove qualifiers from qualified array types. In C23 (unlike in previous standard versions), array types are considered to have the qualifiers of the element type, so typeof_unqual should remove such qualifiers (and an example in the standard shows that is as intended). Fix this by calling strip_array_types when checking for the presence of qualifiers. (The reason we check for qualifiers rather than just using TYPE_MAIN_VARIANT unconditionally is to avoid, as a quality of implementation matter, unnecessarily losing typedef information in the case where the type is already unqualified.) Bootstrapped with no regressions for x86_64-pc-linux-gnu. PR c/112841 gcc/c/ * c-parser.cc (c_parser_typeof_specifier): Call strip_array_types when checking for type qualifiers for typeof_unqual. gcc/testsuite/ * gcc.dg/c23-typeof-4.c: New test. --- gcc/c/c-parser.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'gcc/c/c-parser.cc') diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index f3ed610..44d344f 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -4444,7 +4444,8 @@ c_parser_typeof_specifier (c_parser *parser) parens.skip_until_found_close (parser); if (ret.spec != error_mark_node) { - if (is_unqual && TYPE_QUALS (ret.spec) != TYPE_UNQUALIFIED) + if (is_unqual + && TYPE_QUALS (strip_array_types (ret.spec)) != TYPE_UNQUALIFIED) ret.spec = TYPE_MAIN_VARIANT (ret.spec); if (is_std) { -- cgit v1.1