c: Implement C2Y N3298 - Introduce complex literals [PR117029]

The following patch implements the C2Y N3298 paper Introduce complex literals
by providing different (or no) diagnostics on imaginary constants (except
for integer ones).
For _DecimalN constants we don't support _Complex _DecimalN and error on any
i/j suffixes mixed with DD/DL/DF, so nothing changed there.

2024-11-13  Jakub Jelinek  <jakub@redhat.com>

	PR c/117029
libcpp/
	* include/cpplib.h (struct cpp_options): Add imaginary_constants
	member.
	* init.cc (struct lang_flags): Add imaginary_constants bitfield.
	(lang_defaults): Add column for imaginary_constants.
	(cpp_set_lang): Copy over imaginary_constants.
	* expr.cc (cpp_classify_number): Diagnose CPP_N_IMAGINARY
	non-CPP_N_FLOATING constants differently for C.
gcc/testsuite/
	* gcc.dg/cpp/pr7263-3.c: Adjust expected diagnostic wording.
	* gcc.dg/c23-imaginary-constants-1.c: New test.
	* gcc.dg/c23-imaginary-constants-2.c: New test.
	* gcc.dg/c23-imaginary-constants-3.c: New test.
	* gcc.dg/c23-imaginary-constants-4.c: New test.
	* gcc.dg/c23-imaginary-constants-5.c: New test.
	* gcc.dg/c23-imaginary-constants-6.c: New test.
	* gcc.dg/c23-imaginary-constants-7.c: New test.
	* gcc.dg/c23-imaginary-constants-8.c: New test.
	* gcc.dg/c23-imaginary-constants-9.c: New test.
	* gcc.dg/c23-imaginary-constants-10.c: New test.
	* gcc.dg/c2y-imaginary-constants-1.c: New test.
	* gcc.dg/c2y-imaginary-constants-2.c: New test.
	* gcc.dg/c2y-imaginary-constants-3.c: New test.
	* gcc.dg/c2y-imaginary-constants-4.c: New test.
	* gcc.dg/c2y-imaginary-constants-5.c: New test.
	* gcc.dg/c2y-imaginary-constants-6.c: New test.
	* gcc.dg/c2y-imaginary-constants-7.c: New test.
	* gcc.dg/c2y-imaginary-constants-8.c: New test.
	* gcc.dg/c2y-imaginary-constants-9.c: New test.
	* gcc.dg/c2y-imaginary-constants-10.c: New test.
	* gcc.dg/c2y-imaginary-constants-11.c: New test.
	* gcc.dg/c2y-imaginary-constants-12.c: New test.
This commit is contained in:
Jakub Jelinek
2024-11-13 09:41:41 +01:00
committed by Jakub Jelinek
parent 9b2915d95d
commit eb45d151fa
26 changed files with 594 additions and 35 deletions

View File

@@ -911,8 +911,25 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
syntax_ok:
if (result & CPP_N_IMAGINARY)
cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC, virtual_location, 0,
"imaginary constants are a GCC extension");
{
if (CPP_OPTION (pfile, cplusplus) || (result & CPP_N_FLOATING) == 0)
cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC, virtual_location, 0,
"imaginary constants are a GCC extension");
else
{
bool warned = false;
if (!CPP_OPTION (pfile, imaginary_constants) && CPP_PEDANTIC (pfile))
warned
= cpp_pedwarning_with_line (pfile, CPP_W_PEDANTIC,
virtual_location, 0,
"imaginary constants are a C2Y "
"feature or GCC extension");
if (!warned && CPP_OPTION (pfile, cpp_warn_c23_c2y_compat) > 0)
cpp_warning_with_line (pfile, CPP_W_C23_C2Y_COMPAT,
virtual_location, 0,
"imaginary constants are a C2Y feature");
}
}
if (radix == 2)
{
bool warned = false;