diff options
author | Jakub Jelinek <jakub@redhat.com> | 2023-09-06 17:39:15 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2023-09-06 17:39:15 +0200 |
commit | f76ae4369cb6f38e17510704e5b6e53847d2a648 (patch) | |
tree | 155163c871c2a9f511163913658cdb5c438fe8e4 /libcpp/expr.cc | |
parent | a2f50aa2c578eb0572935e61818e1f2b18b53fd6 (diff) | |
download | gcc-f76ae4369cb6f38e17510704e5b6e53847d2a648.zip gcc-f76ae4369cb6f38e17510704e5b6e53847d2a648.tar.gz gcc-f76ae4369cb6f38e17510704e5b6e53847d2a648.tar.bz2 |
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.
Diffstat (limited to 'libcpp/expr.cc')
-rw-r--r-- | libcpp/expr.cc | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libcpp/expr.cc b/libcpp/expr.cc index b68bf0f..338395a 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; } |