public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Jakub Jelinek <jakub@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-3754] C _BitInt incremental fixes [PR102989] Date: Wed, 6 Sep 2023 15:58:16 +0000 (GMT) [thread overview] Message-ID: <20230906155816.7829D3831394@sourceware.org> (raw) https://gcc.gnu.org/g:f76ae4369cb6f38e17510704e5b6e53847d2a648 commit r14-3754-gf76ae4369cb6f38e17510704e5b6e53847d2a648 Author: Jakub Jelinek <jakub@redhat.com> Date: Wed Sep 6 17:39:15 2023 +0200 C _BitInt incremental fixes [PR102989] On Wed, Aug 09, 2023 at 09:17:57PM +0000, Joseph Myers wrote: > > - _Complex _BitInt(N) isn't supported; again mainly because none of the psABIs > > mention how those should be passed/returned; in a limited way they are > > supported internally because the internal functions into which > > __builtin_{add,sub,mul}_overflow{,_p} is lowered return COMPLEX_TYPE as a > > hack to return 2 values without using references/pointers > > What happens when the usual arithmetic conversions are applied to > operands, one of which is a complex integer type and the other of which is > a wider _BitInt type? I don't see anything in the code to disallow this > case (which would produce an expression with a _Complex _BitInt type), or > any testcases for it. I've added a sorry for that case (+ return the narrower COMPLEX_TYPE). Also added testcase to verify we don't create VECTOR_TYPEs of BITINT_TYPE even if they have mode precision and suitable size (others were rejected already before). > Other testcases I think should be present (along with any corresponding > changes needed to the code itself): > > * Verifying that the new integer constant suffix is rejected for C++. Done. > * Verifying appropriate pedwarn-if-pedantic for the new constant suffix > for versions of C before C2x (and probably for use of _BitInt type > specifiers before C2x as well) - along with the expected -Wc11-c2x-compat > handling (in C2x mode) / -pedantic -Wno-c11-c2x-compat in older modes. Done. Here is an incremental patch which does that. 2023-09-06 Jakub Jelinek <jakub@redhat.com> PR c/102989 gcc/c/ * c-decl.cc (finish_declspecs): Emit pedwarn_c11 on _BitInt. * c-typeck.cc (c_common_type): Emit sorry for common type between _Complex integer and larger _BitInt and return the _Complex integer. gcc/c-family/ * c-attribs.cc (type_valid_for_vector_size): Reject vector types with BITINT_TYPE elements even if they have mode precision and suitable size. gcc/testsuite/ * gcc.dg/bitint-19.c: New test. * gcc.dg/bitint-20.c: New test. * gcc.dg/bitint-21.c: New test. * gcc.dg/bitint-22.c: New test. * gcc.dg/bitint-23.c: New test. * gcc.dg/bitint-24.c: New test. * gcc.dg/bitint-25.c: New test. * gcc.dg/bitint-26.c: New test. * gcc.dg/bitint-27.c: New test. * g++.dg/ext/bitint1.C: New test. * g++.dg/ext/bitint2.C: New test. * g++.dg/ext/bitint3.C: New test. * g++.dg/ext/bitint4.C: New test. libcpp/ * expr.cc (cpp_classify_number): Diagnose wb literal suffixes for -pedantic* before C2X or -Wc11-c2x-compat. Diff: --- gcc/c-family/c-attribs.cc | 3 ++- gcc/c/c-decl.cc | 11 +++++++++-- gcc/c/c-typeck.cc | 6 ++++++ gcc/testsuite/g++.dg/ext/bitint1.C | 9 +++++++++ gcc/testsuite/g++.dg/ext/bitint2.C | 10 ++++++++++ gcc/testsuite/g++.dg/ext/bitint3.C | 8 ++++++++ gcc/testsuite/g++.dg/ext/bitint4.C | 9 +++++++++ gcc/testsuite/gcc.dg/bitint-19.c | 16 ++++++++++++++++ gcc/testsuite/gcc.dg/bitint-20.c | 16 ++++++++++++++++ gcc/testsuite/gcc.dg/bitint-21.c | 11 +++++++++++ gcc/testsuite/gcc.dg/bitint-22.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/bitint-23.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/bitint-24.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/bitint-25.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/bitint-26.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/bitint-27.c | 18 ++++++++++++++++++ libcpp/expr.cc | 23 +++++++++++++++++++++++ 17 files changed, 227 insertions(+), 3 deletions(-) diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index e2792ca6898b..e0c4259c905e 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -4366,7 +4366,8 @@ type_valid_for_vector_size (tree type, tree atname, tree args, && GET_MODE_CLASS (orig_mode) != MODE_INT && !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode)) || !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)) - || TREE_CODE (type) == BOOLEAN_TYPE) + || TREE_CODE (type) == BOOLEAN_TYPE + || TREE_CODE (type) == BITINT_TYPE) { if (error_p) error ("invalid vector type for attribute %qE", atname); diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index c9dd135d9230..649c5ae66c28 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -12934,8 +12934,15 @@ finish_declspecs (struct c_declspecs *specs) if (specs->u.bitint_prec == -1) specs->type = integer_type_node; else - specs->type = build_bitint_type (specs->u.bitint_prec, - specs->unsigned_p); + { + pedwarn_c11 (specs->locations[cdw_typespec], OPT_Wpedantic, + "ISO C does not support %<%s_BitInt(%d)%> before C2X", + specs->unsigned_p ? "unsigned " + : specs->signed_p ? "signed " : "", + specs->u.bitint_prec); + specs->type = build_bitint_type (specs->u.bitint_prec, + specs->unsigned_p); + } break; default: gcc_unreachable (); diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index 5bb9f83ab869..e2bfd2caf856 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -817,6 +817,12 @@ c_common_type (tree t1, tree t2) return t1; else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype) return t2; + else if (TREE_CODE (subtype) == BITINT_TYPE) + { + sorry ("%<_Complex _BitInt(%d)%> unsupported", + TYPE_PRECISION (subtype)); + return code1 == COMPLEX_TYPE ? t1 : t2; + } else return build_complex_type (subtype); } diff --git a/gcc/testsuite/g++.dg/ext/bitint1.C b/gcc/testsuite/g++.dg/ext/bitint1.C new file mode 100644 index 000000000000..3d9afdcd395f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitint1.C @@ -0,0 +1,9 @@ +// PR c/102989 +// { dg-do compile } + +_BitInt(63) a; // { dg-error "expected" } +unsigned _BitInt(31) b; // { dg-error "expected" } +int c = 21wb; // { dg-error "invalid suffix \"wb\" on integer constant" "" { target c++98_only } } + // { dg-error "unable to find numeric literal operator 'operator\"\"wb'" "" { target c++11 } .-1 } +long long d = 60594869054uwb; // { dg-error "invalid suffix \"uwb\" on integer constant" "" { target c++98_only } } + // { dg-error "unable to find numeric literal operator 'operator\"\"uwb'" "" { target c++11 } .-1 } diff --git a/gcc/testsuite/g++.dg/ext/bitint2.C b/gcc/testsuite/g++.dg/ext/bitint2.C new file mode 100644 index 000000000000..ae8b9cbd0f46 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitint2.C @@ -0,0 +1,10 @@ +// PR c/102989 +// { dg-do compile } +// { dg-options "" } + +_BitInt(63) a; // { dg-error "expected" } +unsigned _BitInt(31) b; // { dg-error "expected" } +int c = 21wb; // { dg-error "invalid suffix \"wb\" on integer constant" "" { target c++98_only } } + // { dg-error "unable to find numeric literal operator 'operator\"\"wb'" "" { target c++11 } .-1 } +long long d = 60594869054uwb; // { dg-error "invalid suffix \"uwb\" on integer constant" "" { target c++98_only } } + // { dg-error "unable to find numeric literal operator 'operator\"\"uwb'" "" { target c++11 } .-1 } diff --git a/gcc/testsuite/g++.dg/ext/bitint3.C b/gcc/testsuite/g++.dg/ext/bitint3.C new file mode 100644 index 000000000000..8918a7f77cd9 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitint3.C @@ -0,0 +1,8 @@ +// PR c/102989 +// { dg-do compile { target c++11 } } + +constexpr int operator""wb (unsigned long long) { return 0; } // { dg-warning "reserved for future standardization" } +constexpr int operator""uwb (unsigned long long) { return 1; } // { dg-warning "reserved for future standardization" } + +static_assert (-42wb == 0, ""); +static_assert (81uwb == 1, ""); diff --git a/gcc/testsuite/g++.dg/ext/bitint4.C b/gcc/testsuite/g++.dg/ext/bitint4.C new file mode 100644 index 000000000000..32e1ac5ac48f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/bitint4.C @@ -0,0 +1,9 @@ +// PR c/102989 +// { dg-do compile { target c++11 } } +// { dg-options "" } + +constexpr int operator""wb (unsigned long long) { return 0; } // { dg-warning "reserved for future standardization" } +constexpr int operator""uwb (unsigned long long) { return 1; } // { dg-warning "reserved for future standardization" } + +static_assert (-42wb == 0, ""); +static_assert (81uwb == 1, ""); diff --git a/gcc/testsuite/gcc.dg/bitint-19.c b/gcc/testsuite/gcc.dg/bitint-19.c new file mode 100644 index 000000000000..f33a82c3b391 --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-19.c @@ -0,0 +1,16 @@ +/* PR c/102989 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-std=gnu2x" } */ + +#define expr_has_type(e, t) _Generic (e, default : 0, t : 1) + +void +foo (_Complex int ci, _Complex long long cl) +{ + _BitInt(__SIZEOF_INT__ * __CHAR_BIT__ - 1) bi = 0wb; + _BitInt(__SIZEOF_LONG_LONG__ * __CHAR_BIT__ - 1) bl = 0wb; + static_assert (expr_has_type (ci + bi, _Complex int)); + static_assert (expr_has_type (cl + bl, _Complex long long)); + static_assert (expr_has_type (bi + ci, _Complex int)); + static_assert (expr_has_type (bl + cl, _Complex long long)); +} diff --git a/gcc/testsuite/gcc.dg/bitint-20.c b/gcc/testsuite/gcc.dg/bitint-20.c new file mode 100644 index 000000000000..6b92b5b7ddae --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-20.c @@ -0,0 +1,16 @@ +/* PR c/102989 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-std=gnu2x" } */ + +void +foo (_Complex int ci, _Complex long long cl) +{ + _BitInt(__SIZEOF_INT__ * __CHAR_BIT__ + 1) bi = 0wb; + ci + bi; /* { dg-message "unsupported" } */ + bi + ci; /* { dg-message "unsupported" } */ +#if __BITINT_MAXWIDTH__ >= 575 + _BitInt(575) bw = 0wb; + cl + bw; /* { dg-message "unsupported" "" { target bitint575 } } */ + bw + cl; /* { dg-message "unsupported" "" { target bitint575 } } */ +#endif +} diff --git a/gcc/testsuite/gcc.dg/bitint-21.c b/gcc/testsuite/gcc.dg/bitint-21.c new file mode 100644 index 000000000000..72f68c95a29a --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-21.c @@ -0,0 +1,11 @@ +/* PR c/102989 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-std=gnu2x" } */ + +#define IB __SIZEOF_INT__ * __CHAR_BIT__ +typedef _BitInt(IB) V1 __attribute__((vector_size (sizeof (_BitInt(IB))))); /* { dg-error "invalid vector type for attribute 'vector_size'" } */ +typedef _BitInt(IB) V2 __attribute__((vector_size (8 * sizeof (_BitInt(IB))))); /* { dg-error "invalid vector type for attribute 'vector_size'" } */ +#if __BITINT_MAXWIDTH__ >= 575 +typedef _BitInt(575) V3 __attribute__((vector_size (sizeof (_BitInt(575))))); /* { dg-error "invalid vector type for attribute 'vector_size'" "" { target bitint575 } } */ +typedef _BitInt(575) V3 __attribute__((vector_size (16 * sizeof (_BitInt(575))))); /* { dg-error "invalid vector type for attribute 'vector_size'" "" { target bitint575 } } */ +#endif diff --git a/gcc/testsuite/gcc.dg/bitint-22.c b/gcc/testsuite/gcc.dg/bitint-22.c new file mode 100644 index 000000000000..329d8a885d8f --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-22.c @@ -0,0 +1,18 @@ +// PR c/102989 +// { dg-do compile { target bitint } } +// { dg-options "-std=c2x -pedantic-errors" } + +_BitInt(63) a; +signed _BitInt(15) b; +unsigned _BitInt(31) c; +int d = 21wb; +long long e = 60594869054uwb; +__extension__ _BitInt(63) f; +__extension__ _BitInt(15) g; +__extension__ unsigned _BitInt(31) h; +int i = __extension__ 21wb; +long long j = __extension__ 60594869054uwb; +#if 0wb == 0 +#endif +#if 0uwb == 0 +#endif diff --git a/gcc/testsuite/gcc.dg/bitint-23.c b/gcc/testsuite/gcc.dg/bitint-23.c new file mode 100644 index 000000000000..89041c0f7aed --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-23.c @@ -0,0 +1,18 @@ +// PR c/102989 +// { dg-do compile { target bitint } } +// { dg-options "-std=c2x -pedantic-errors -Wc11-c2x-compat" } + +_BitInt(63) a; /* { dg-warning "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */ +signed _BitInt(15) b; /* { dg-warning "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */ +unsigned _BitInt(31) c; /* { dg-warning "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */ +int d = 21wb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +long long e = 60594869054uwb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +__extension__ _BitInt(63) f; +__extension__ _BitInt(15) g; +__extension__ unsigned _BitInt(31) h; +int i = __extension__ 21wb; +long long j = __extension__ 60594869054uwb; +#if 0wb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +#endif +#if 0uwb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +#endif diff --git a/gcc/testsuite/gcc.dg/bitint-24.c b/gcc/testsuite/gcc.dg/bitint-24.c new file mode 100644 index 000000000000..321b5522e736 --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-24.c @@ -0,0 +1,18 @@ +// PR c/102989 +// { dg-do compile { target bitint } } +// { dg-options "-std=c11" } + +_BitInt(63) a; +signed _BitInt(15) b; +unsigned _BitInt(31) c; +int d = 21wb; +long long e = 60594869054uwb; +__extension__ _BitInt(63) f; +__extension__ _BitInt(15) g; +__extension__ unsigned _BitInt(31) h; +int i = __extension__ 21wb; +long long j = __extension__ 60594869054uwb; +#if 0wb == 0 +#endif +#if 0uwb == 0 +#endif diff --git a/gcc/testsuite/gcc.dg/bitint-25.c b/gcc/testsuite/gcc.dg/bitint-25.c new file mode 100644 index 000000000000..b18244f3459c --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-25.c @@ -0,0 +1,18 @@ +// PR c/102989 +// { dg-do compile { target bitint } } +// { dg-options "-std=c11 -Wno-c11-c2x-compat -pedantic-errors" } + +_BitInt(63) a; +signed _BitInt(15) b; +unsigned _BitInt(31) c; +int d = 21wb; +long long e = 60594869054uwb; +__extension__ _BitInt(63) f; +__extension__ _BitInt(15) g; +__extension__ unsigned _BitInt(31) h; +int i = __extension__ 21wb; +long long j = __extension__ 60594869054uwb; +#if 0wb == 0 +#endif +#if 0uwb == 0 +#endif diff --git a/gcc/testsuite/gcc.dg/bitint-26.c b/gcc/testsuite/gcc.dg/bitint-26.c new file mode 100644 index 000000000000..c5ce1acdaaf8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-26.c @@ -0,0 +1,18 @@ +// PR c/102989 +// { dg-do compile { target bitint } } +// { dg-options "-std=c11 -pedantic" } + +_BitInt(63) a; /* { dg-warning "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */ +signed _BitInt(15) b; /* { dg-warning "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */ +unsigned _BitInt(31) c; /* { dg-warning "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */ +int d = 21wb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +long long e = 60594869054uwb; /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +__extension__ _BitInt(63) f; +__extension__ _BitInt(15) g; +__extension__ unsigned _BitInt(31) h; +int i = __extension__ 21wb; +long long j = __extension__ 60594869054uwb; +#if 0wb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +#endif +#if 0uwb == 0 /* { dg-warning "ISO C does not support literal 'wb' suffixes before C2X" } */ +#endif diff --git a/gcc/testsuite/gcc.dg/bitint-27.c b/gcc/testsuite/gcc.dg/bitint-27.c new file mode 100644 index 000000000000..e85f28830ec3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitint-27.c @@ -0,0 +1,18 @@ +// PR c/102989 +// { dg-do compile { target bitint } } +// { dg-options "-std=c11 -pedantic-errors" } + +_BitInt(63) a; /* { dg-error "ISO C does not support '_BitInt\\\(63\\\)' before C2X" } */ +signed _BitInt(15) b; /* { dg-error "ISO C does not support 'signed _BitInt\\\(15\\\)' before C2X" } */ +unsigned _BitInt(31) c; /* { dg-error "ISO C does not support 'unsigned _BitInt\\\(31\\\)' before C2X" } */ +int d = 21wb; /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */ +long long e = 60594869054uwb; /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */ +__extension__ _BitInt(63) f; +__extension__ _BitInt(15) g; +__extension__ unsigned _BitInt(31) h; +int i = __extension__ 21wb; +long long j = __extension__ 60594869054uwb; +#if 0wb == 0 /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */ +#endif +#if 0uwb == 0 /* { dg-error "ISO C does not support literal 'wb' suffixes before C2X" } */ +#endif diff --git a/libcpp/expr.cc b/libcpp/expr.cc index b68bf0f9ab12..338395a2c44c 100644 --- a/libcpp/expr.cc +++ b/libcpp/expr.cc @@ -856,6 +856,29 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, virtual_location, 0, message); } + if ((result & CPP_N_BITINT) != 0 + && CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) != 0) + { + if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0) + { + const char *message = N_("ISO C does not support literal " + "%<wb%> suffixes before C2X"); + if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, true_false)) + cpp_pedwarning_with_line (pfile, CPP_W_C11_C2X_COMPAT, + virtual_location, 0, message); + else + cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT, + virtual_location, 0, message); + } + else if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, true_false)) + { + const char *message = N_("ISO C does not support literal " + "%<wb%> suffixes before C2X"); + cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, + message); + } + } + result |= CPP_N_INTEGER; }
reply other threads:[~2023-09-06 15:58 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20230906155816.7829D3831394@sourceware.org \ --to=jakub@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /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: linkBe 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).