From: Joseph Myers <joseph@codesourcery.com>
To: Martin Uecker <uecker@tugraz.at>
Cc: <gcc-patches@gcc.gnu.org>
Subject: Re: [C PATCH 3/6] c23: tag compatibility rules for struct and unions
Date: Tue, 7 Nov 2023 23:18:19 +0000 [thread overview]
Message-ID: <a7a59f-4f4b-82ab-fdbb-824bb9a73ea5@codesourcery.com> (raw)
In-Reply-To: <00f5c725f1e5234a8f5f396c393d4d09159c6eae.camel@tugraz.at>
On Sat, 26 Aug 2023, Martin Uecker via Gcc-patches wrote:
> types (convert_for_assignment): Ingore qualifiers.
"Ignore".
> @@ -1993,6 +1993,24 @@ locate_old_decl (tree decl)
> decl, TREE_TYPE (decl));
> }
>
> +static tree
> +previous_tag (tree type)
This function needs a comment documenting its semantics.
> @@ -8651,6 +8672,12 @@ start_struct (location_t loc, enum tree_code code, tree name,
>
> if (name != NULL_TREE)
> ref = lookup_tag (code, name, true, &refloc);
> +
> + /* For C2X, even if we already have a completed definition,
> + we do not use it. We will check for consistency later. */
> + if (flag_isoc2x && ref && TYPE_SIZE (ref))
> + ref = NULL_TREE;
> +
> if (ref && TREE_CODE (ref) == code)
> {
> if (TYPE_STUB_DECL (ref))
This comes before the check for nested redefinitions (which are still
invalid) - so meaning that, if ref is set to NULL_TREE here, the check
for nested redefinitions won't apply.
You have a testcase for nested redefinitions in a slightly different case
(where the struct's first definition hasn't finished when the nested
definition is encountered). But what about the case where: first, the
struct gets defined; then, in the same scope, it gets redefined, with the
redefinition containing a nested redefinition? I don't see anything here
to detect that case of nested redefinitions
For enums, note that nested redefinitions include cases where the nesting
is inside an enum type specifier (currently diagnosed by GCC following an
ordinary redefinition path, not one for nested definitions).
typedef __SIZE_TYPE__ size_t;
enum e : typeof (sizeof (enum e : size_t { A })) { A };
is invalid because the definitions of enum e are nested, so should be
diagnosed, and there should be a test that it is.
> @@ -8315,6 +8332,13 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype,
> conversion. */
> inside_init = convert (type, inside_init);
>
> + if ((code == RECORD_TYPE || code == UNION_TYPE)
> + && !comptypes (TYPE_MAIN_VARIANT (type), TYPE_MAIN_VARIANT (TREE_TYPE (inside_init))))
> + {
> + error_init (init_loc, "invalid initializer %qT %qT", type, TREE_TYPE (inside_init));
> + return error_mark_node;
> + }
I'd expect some words between the two type names, or explaining how they
relate to the initialization, rather than just two type names in
succession with no explanation of what's the type of the initializer and
what's the type of the object being initialized.
> diff --git a/gcc/testsuite/gcc.dg/c2x-tag-1.c b/gcc/testsuite/gcc.dg/c2x-tag-1.c
> +struct r { int a; char b[0]; };
I tend to think tests such as this, involving GNU extensions ([0] arrays),
should go in gnu23-* tests not c23-* ones.
(I'm currently testing the final C2X -> C23 patch, that renames existing
tests. The next revision of this patch series will need updating for the
renaming in both file names and file contents.)
> +++ b/gcc/testsuite/gcc.dg/c2x-tag-10.c
This is definitely a GNU extensions test (VLAs in structures).
> +++ b/gcc/testsuite/gcc.dg/c2x-tag-4.c
Another GNU extensions test (GNU attributes).
> diff --git a/gcc/testsuite/gcc.dg/c2x-tag-7.c b/gcc/testsuite/gcc.dg/c2x-tag-7.c
Another GNU extensions test (VLAs in structures).
--
Joseph S. Myers
joseph@codesourcery.com
next prev parent reply other threads:[~2023-11-07 23:18 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-26 16:19 c23 type compatibility rules, v2 Martin Uecker
2023-08-26 16:20 ` [C PATCH 1/6] c: reorganize recursive type checking Martin Uecker
2023-09-06 20:59 ` Joseph Myers
2023-09-10 8:17 ` [C PATCH 1/6 v2] " Martin Uecker
2023-09-11 20:28 ` Joseph Myers
2023-08-26 16:22 ` [C PATCH 2/6] c23: recursive type checking of tagged type Martin Uecker
2023-11-07 23:06 ` Joseph Myers
2023-08-26 16:23 ` [C PATCH 3/6] c23: tag compatibility rules for struct and unions Martin Uecker
2023-11-07 23:18 ` Joseph Myers [this message]
2023-08-26 16:24 ` [C PATCH 4/6] c23: tag compatibility rules for enums Martin Uecker
2023-11-07 23:20 ` Joseph Myers
2023-08-26 16:25 ` [C PATCH 5/6] c23: aliasing of compatible tagged types Martin Uecker
2023-08-26 16:26 ` [C PATCH 6/6] c23: construct composite type for " Martin Uecker
2023-11-07 23:45 ` Joseph Myers
2023-08-26 16:26 ` [C PATCH] c: flag for tag compatibility rules Martin Uecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a7a59f-4f4b-82ab-fdbb-824bb9a73ea5@codesourcery.com \
--to=joseph@codesourcery.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=uecker@tugraz.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).