Re: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
> On Feb 23, 2023, at 7:56 PM, Joseph Myers wrote: > > On Thu, 23 Feb 2023, Qing Zhao via Gcc-patches wrote: > >> But the following: >> >> struct flex1 { int length1; char data1[]; }; >> struct flex2 { int length2; char data2[]; }; >> union union_flex { struct flex1 f1; struct flex2 f2; }; /* this is C >> standard. */ >> >> struct out_flex { int n; union union_flex flex_data1;}; /* this is GNU >> extension. */ >> >> Should add this item into the documentation? > > "union that contains a structure with a flexible array member" is just > like "structure with a flexible array member". I suppose the > documentation should try to make that clear, without repeating it too much > for every separate case. Okay, thanks. Qing > > -- > Joseph S. Myers > jos...@codesourcery.com
Re: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
On Thu, 23 Feb 2023, Qing Zhao via Gcc-patches wrote: > But the following: > > struct flex1 { int length1; char data1[]; }; > struct flex2 { int length2; char data2[]; }; > union union_flex { struct flex1 f1; struct flex2 f2; }; /* this is C > standard. */ > > struct out_flex { int n; union union_flex flex_data1;}; /* this is GNU > extension. */ > > Should add this item into the documentation? "union that contains a structure with a flexible array member" is just like "structure with a flexible array member". I suppose the documentation should try to make that clear, without repeating it too much for every separate case. -- Joseph S. Myers jos...@codesourcery.com
Re: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
> On Feb 23, 2023, at 5:04 PM, Qing Zhao via Gcc-patches > wrote: > > > >> On Feb 23, 2023, at 4:24 PM, Joseph Myers wrote: >> >> On Thu, 23 Feb 2023, Qing Zhao via Gcc-patches wrote: >> >>> +@item >>> +The structure with a C99 flexible array member is the field of >>> +another union, for example: >>> + >>> +@smallexample >>> +struct flex1 @{ int length1; char data1[]; @} >>> +struct flex2 @{ int length2; char data2[]; @} >>> + >>> +union out_flex @{ struct flex1 flex_data1; struct flex2 flex_data2; @} >> >> I don't think this is an extension; structures with flexible array members >> are OK in unions in standard C. > > Thanks for the info. > > Just checked the small testing case with -Wpedantic, Yes, it’s accepted > without any warning. > Will delete this item from the doc. And send the new patch soon. But the following: struct flex1 { int length1; char data1[]; }; struct flex2 { int length2; char data2[]; }; union union_flex { struct flex1 f1; struct flex2 f2; }; /* this is C standard. */ struct out_flex { int n; union union_flex flex_data1;}; /* this is GNU extension. */ Should add this item into the documentation? Qing > > Thanks. > > Qing >> >> -- >> Joseph S. Myers >> jos...@codesourcery.com
Re: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
> On Feb 23, 2023, at 4:24 PM, Joseph Myers wrote: > > On Thu, 23 Feb 2023, Qing Zhao via Gcc-patches wrote: > >> +@item >> +The structure with a C99 flexible array member is the field of >> +another union, for example: >> + >> +@smallexample >> +struct flex1 @{ int length1; char data1[]; @} >> +struct flex2 @{ int length2; char data2[]; @} >> + >> +union out_flex @{ struct flex1 flex_data1; struct flex2 flex_data2; @} > > I don't think this is an extension; structures with flexible array members > are OK in unions in standard C. Thanks for the info. Just checked the small testing case with -Wpedantic, Yes, it’s accepted without any warning. Will delete this item from the doc. And send the new patch soon. Thanks. Qing > > -- > Joseph S. Myers > jos...@codesourcery.com
Re: Fwd: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
On Thu, 23 Feb 2023, Qing Zhao via Gcc-patches wrote: > +@item > +The structure with a C99 flexible array member is the field of > +another union, for example: > + > +@smallexample > +struct flex1 @{ int length1; char data1[]; @} > +struct flex2 @{ int length2; char data2[]; @} > + > +union out_flex @{ struct flex1 flex_data1; struct flex2 flex_data2; @} I don't think this is an extension; structures with flexible array members are OK in unions in standard C. -- Joseph S. Myers jos...@codesourcery.com
Fwd: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
Ping * 2. Hi, Joseph and Richard, Could you please review this patch and let me know whether it’s ready for committing into GCC13? thanks. Qing Begin forwarded message: From: Qing Zhao mailto:qing.z...@oracle.com>> Subject: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650) Date: February 10, 2023 at 7:50:13 PM EST To: jos...@codesourcery.com<mailto:jos...@codesourcery.com>, rguent...@suse.de<mailto:rguent...@suse.de> Cc: siddh...@gotplt.org<mailto:siddh...@gotplt.org>, keesc...@chromium.org<mailto:keesc...@chromium.org>, gcc-patches@gcc.gnu.org<mailto:gcc-patches@gcc.gnu.org>, Qing Zhao mailto:qing.z...@oracle.com>> on structure with C99 flexible array member being nested in another structure. This is also fixed PR77650. " GCC extension accepts a structure containing a ISO C99 "flexible array member", or a union containing such a structure (possibly recursively) to be a member of a structure. There are three situations: * The structure with a C99 flexible array member is the last field of another structure, for example: struct flex { int length; char data[]; }; struct out_flex { int m; struct flex flex_data; }; In the above, 'flex_data.data[]' is considered as a flexible array too. * The structure with a C99 flexible array member is the field of another union, for example: struct flex1 { int length1; char data1[]; } struct flex2 { int length2; char data2[]; } union out_flex { struct flex1 flex_data1; struct flex2 flex_data2; } In the above, 'flex_data1.data1[]' or 'flex_data2.data2[]' is considered as flexible arrays too. * The structure with a C99 flexible array member is the middle field of another structure, for example: struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; In the above, 'flex_data.data[]' is allowed to be extended flexibly to the padding. E.g, up to 4 elements. However, relying on space in struct padding is a bad programming practice, compilers do not handle such extension consistently, Any code relying on this behavior should be modified to ensure that flexible array members only end up at the ends of structures. Please use warning option '-Wgnu-variable-sized-type-not-at-end' to identify all such cases in the source code and modify them. This extension will be deprecated from gcc in the next release. " gcc/c-family/ChangeLog: PR c/77650 * c.opt: New option -Wgnu-variable-sized-type-not-at-end. gcc/c/ChangeLog: PR c/77650 * c-decl.cc<http://c-decl.cc> (finish_struct): Issue warnings for new option. gcc/ChangeLog: PR c/77650 * doc/extend.texi: Document GCC extension on a structure containing a flexible array member to be a member of another structure. gcc/testsuite/ChangeLog: PR c/77650 * gcc.dg/variable-sized-type-flex-array.c: New test. --- gcc/c-family/c.opt| 5 ++ gcc/c/c-decl.cc<http://c-decl.cc> | 7 +++ gcc/doc/extend.texi | 58 ++- .../gcc.dg/variable-sized-type-flex-array.c | 31 ++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/variable-sized-type-flex-array.c diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index c0fea56a8f5..fd720538800 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -737,6 +737,11 @@ Wformat-truncation= C ObjC C++ LTO ObjC++ Joined RejectNegative UInteger Var(warn_format_trunc) Warning LangEnabledBy(C ObjC C++ LTO ObjC++,Wformat=, warn_format >= 1, 0) IntegerRange(0, 2) Warn about calls to snprintf and similar functions that truncate output. +Wgnu-variable-sized-type-not-at-end +C C++ Var(warn_variable_sized_type_not_at_end) Warning +Warn about structures or unions with C99 flexible array members are not +at the end of a structure. + Wif-not-aligned C ObjC C++ ObjC++ Var(warn_if_not_aligned) Init(1) Warning Warn when the field in a struct is not aligned. diff --git a/gcc/c/c-decl.cc<http://c-decl.cc> b/gcc/c/c-decl.cc<http://c-decl.cc> index 741a37560b0..041df4355da 100644 --- a/gcc/c/c-decl.cc<http://c-decl.cc> +++ b/gcc/c/c-decl.cc<http://c-decl.cc> @@ -9289,6 +9289,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, && is_last_field) TYPE_INCLUDE_FLEXARRAY (t) = true; + if (warn_variable_sized_type_not_at_end + && !is_last_field + && TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (x))) + warning_at (DECL_SOURCE_LOCATION (x), +OPT_Wgnu_variable_sized_type_not_at_end, +"variable sized type not at the end of a struct"); + if (DECL_NAME (x) || RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))) saw_named_field = true; diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 5a0
Re: [v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
Ping… Qing > On Feb 10, 2023, at 7:50 PM, Qing Zhao wrote: > > on structure with C99 flexible array member being nested in another structure. > > This is also fixed PR77650. > > " GCC extension accepts a structure containing a ISO C99 "flexible array > member", or a union containing such a structure (possibly recursively) > to be a member of a structure. > > There are three situations: > > * The structure with a C99 flexible array member is the last field of > another structure, for example: > > struct flex { int length; char data[]; }; > > struct out_flex { int m; struct flex flex_data; }; > > In the above, 'flex_data.data[]' is considered as a flexible array > too. > > * The structure with a C99 flexible array member is the field of > another union, for example: > > struct flex1 { int length1; char data1[]; } > struct flex2 { int length2; char data2[]; } > > union out_flex { struct flex1 flex_data1; struct flex2 flex_data2; } > > In the above, 'flex_data1.data1[]' or 'flex_data2.data2[]' is > considered as flexible arrays too. > > * The structure with a C99 flexible array member is the middle field > of another structure, for example: > > struct flex { int length; char data[]; }; > > struct mid_flex { int m; struct flex flex_data; int n; }; > > In the above, 'flex_data.data[]' is allowed to be extended flexibly > to the padding. E.g, up to 4 elements. > > However, relying on space in struct padding is a bad programming > practice, compilers do not handle such extension consistently, Any > code relying on this behavior should be modified to ensure that > flexible array members only end up at the ends of structures. > > Please use warning option '-Wgnu-variable-sized-type-not-at-end' to > identify all such cases in the source code and modify them. This > extension will be deprecated from gcc in the next release. " > > gcc/c-family/ChangeLog: > > PR c/77650 > * c.opt: New option -Wgnu-variable-sized-type-not-at-end. > > gcc/c/ChangeLog: > > PR c/77650 > * c-decl.cc (finish_struct): Issue warnings for new option. > > gcc/ChangeLog: > > PR c/77650 > * doc/extend.texi: Document GCC extension on a structure containing > a flexible array member to be a member of another structure. > > gcc/testsuite/ChangeLog: > > PR c/77650 > * gcc.dg/variable-sized-type-flex-array.c: New test. > --- > gcc/c-family/c.opt| 5 ++ > gcc/c/c-decl.cc | 7 +++ > gcc/doc/extend.texi | 58 ++- > .../gcc.dg/variable-sized-type-flex-array.c | 31 ++ > 4 files changed, 100 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/variable-sized-type-flex-array.c > > diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt > index c0fea56a8f5..fd720538800 100644 > --- a/gcc/c-family/c.opt > +++ b/gcc/c-family/c.opt > @@ -737,6 +737,11 @@ Wformat-truncation= > C ObjC C++ LTO ObjC++ Joined RejectNegative UInteger Var(warn_format_trunc) > Warning LangEnabledBy(C ObjC C++ LTO ObjC++,Wformat=, warn_format >= 1, 0) > IntegerRange(0, 2) > Warn about calls to snprintf and similar functions that truncate output. > > +Wgnu-variable-sized-type-not-at-end > +C C++ Var(warn_variable_sized_type_not_at_end) Warning > +Warn about structures or unions with C99 flexible array members are not > +at the end of a structure. > + > Wif-not-aligned > C ObjC C++ ObjC++ Var(warn_if_not_aligned) Init(1) Warning > Warn when the field in a struct is not aligned. > diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc > index 741a37560b0..041df4355da 100644 > --- a/gcc/c/c-decl.cc > +++ b/gcc/c/c-decl.cc > @@ -9289,6 +9289,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, > tree attributes, > && is_last_field) > TYPE_INCLUDE_FLEXARRAY (t) = true; > > + if (warn_variable_sized_type_not_at_end > + && !is_last_field > + && TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (x))) > + warning_at (DECL_SOURCE_LOCATION (x), > + OPT_Wgnu_variable_sized_type_not_at_end, > + "variable sized type not at the end of a struct"); > + > if (DECL_NAME (x) > || RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))) > saw_named_field = true; > diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi > index 5a026c4b48c..737228b35ac 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -1748,7 +1748,63 @@ Flexible array members may only appear as the last > member of a > A structure containing a flexible array member, or a union containing > such a structure (possibly recursively), may not be a member of a > structure or an element of an array. (However, these uses are > -permitted by GCC as extensions.) > +permitted by GCC as extensions, see details below.) > +@end itemize
[v3][PATCH 2/2] Update documentation to clarify a GCC extension (PR77650)
on structure with C99 flexible array member being nested in another structure. This is also fixed PR77650. " GCC extension accepts a structure containing a ISO C99 "flexible array member", or a union containing such a structure (possibly recursively) to be a member of a structure. There are three situations: * The structure with a C99 flexible array member is the last field of another structure, for example: struct flex { int length; char data[]; }; struct out_flex { int m; struct flex flex_data; }; In the above, 'flex_data.data[]' is considered as a flexible array too. * The structure with a C99 flexible array member is the field of another union, for example: struct flex1 { int length1; char data1[]; } struct flex2 { int length2; char data2[]; } union out_flex { struct flex1 flex_data1; struct flex2 flex_data2; } In the above, 'flex_data1.data1[]' or 'flex_data2.data2[]' is considered as flexible arrays too. * The structure with a C99 flexible array member is the middle field of another structure, for example: struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; In the above, 'flex_data.data[]' is allowed to be extended flexibly to the padding. E.g, up to 4 elements. However, relying on space in struct padding is a bad programming practice, compilers do not handle such extension consistently, Any code relying on this behavior should be modified to ensure that flexible array members only end up at the ends of structures. Please use warning option '-Wgnu-variable-sized-type-not-at-end' to identify all such cases in the source code and modify them. This extension will be deprecated from gcc in the next release. " gcc/c-family/ChangeLog: PR c/77650 * c.opt: New option -Wgnu-variable-sized-type-not-at-end. gcc/c/ChangeLog: PR c/77650 * c-decl.cc (finish_struct): Issue warnings for new option. gcc/ChangeLog: PR c/77650 * doc/extend.texi: Document GCC extension on a structure containing a flexible array member to be a member of another structure. gcc/testsuite/ChangeLog: PR c/77650 * gcc.dg/variable-sized-type-flex-array.c: New test. --- gcc/c-family/c.opt| 5 ++ gcc/c/c-decl.cc | 7 +++ gcc/doc/extend.texi | 58 ++- .../gcc.dg/variable-sized-type-flex-array.c | 31 ++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/variable-sized-type-flex-array.c diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index c0fea56a8f5..fd720538800 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -737,6 +737,11 @@ Wformat-truncation= C ObjC C++ LTO ObjC++ Joined RejectNegative UInteger Var(warn_format_trunc) Warning LangEnabledBy(C ObjC C++ LTO ObjC++,Wformat=, warn_format >= 1, 0) IntegerRange(0, 2) Warn about calls to snprintf and similar functions that truncate output. +Wgnu-variable-sized-type-not-at-end +C C++ Var(warn_variable_sized_type_not_at_end) Warning +Warn about structures or unions with C99 flexible array members are not +at the end of a structure. + Wif-not-aligned C ObjC C++ ObjC++ Var(warn_if_not_aligned) Init(1) Warning Warn when the field in a struct is not aligned. diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 741a37560b0..041df4355da 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -9289,6 +9289,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, && is_last_field) TYPE_INCLUDE_FLEXARRAY (t) = true; + if (warn_variable_sized_type_not_at_end + && !is_last_field + && TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (x))) + warning_at (DECL_SOURCE_LOCATION (x), + OPT_Wgnu_variable_sized_type_not_at_end, + "variable sized type not at the end of a struct"); + if (DECL_NAME (x) || RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))) saw_named_field = true; diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 5a026c4b48c..737228b35ac 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -1748,7 +1748,63 @@ Flexible array members may only appear as the last member of a A structure containing a flexible array member, or a union containing such a structure (possibly recursively), may not be a member of a structure or an element of an array. (However, these uses are -permitted by GCC as extensions.) +permitted by GCC as extensions, see details below.) +@end itemize + +GCC extension accepts a structure containing a ISO C99 @dfn{flexible array +member}, or a union containing such a structure (possibly recursively) +to be a member of a structure. + +There are three situations: + +@itemize @bullet