c: C2x binary constants

C2x adds binary integer constants (approved at the last WG14 meeting,
though not yet added to the working draft in git).  Configure libcpp
to consider these a standard feature in C2x mode, with appropriate
updates to diagnostics including support for diagnosing them with
-std=c2x -Wc11-c2x-compat.

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

gcc/testsuite/
2020-11-13  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/binary-constants-2.c, gcc.dg/binary-constants-3.c,
	gcc.dg/system-binary-constants-1.c: Update expected diagnostics.
	* gcc.dg/c11-binary-constants-1.c,
	gcc.dg/c11-binary-constants-2.c, gcc.dg/c2x-binary-constants-1.c,
	gcc.dg/c2x-binary-constants-2.c, gcc.dg/c2x-binary-constants-3.c:
	New tests.

libcpp/
2020-11-13  Joseph Myers  <joseph@codesourcery.com>

	* expr.c (cpp_classify_number): Update diagnostic for binary
	constants for C.  Also diagnose binary constants for
	-Wc11-c2x-compat.
	* init.c (lang_defaults): Enable binary constants for GNUC2X and
	STDC2X.
This commit is contained in:
Joseph Myers 2020-11-13 22:45:22 +00:00
parent f3dc991fba
commit e400a64936
10 changed files with 69 additions and 15 deletions

View File

@ -9,8 +9,8 @@
int
foo (void)
{
#if FOO /* { dg-warning "binary constants are a GCC extension" } */
#if FOO /* { dg-warning "binary constants are a C2X feature or GCC extension" } */
return 23;
#endif
return 0b1101; /* { dg-warning "binary constants are a GCC extension" } */
return 0b1101; /* { dg-warning "binary constants are a C2X feature or GCC extension" } */
}

View File

@ -9,8 +9,8 @@
int
foo (void)
{
#if FOO /* { dg-error "binary constants are a GCC extension" } */
#if FOO /* { dg-error "binary constants are a C2X feature or GCC extension" } */
return 23;
#endif
return 0b1101; /* { dg-error "binary constants are a GCC extension" } */
return 0b1101; /* { dg-error "binary constants are a C2X feature or GCC extension" } */
}

View File

@ -0,0 +1,11 @@
/* Test that binary constants are diagnosed in C11 mode: -pedantic. */
/* { dg-do compile } */
/* { dg-options "-std=c11 -pedantic" } */
int a = 0b1; /* { dg-warning "binary constants" } */
#if 0b101 /* { dg-warning "binary constants" } */
#endif
int b = 0B1; /* { dg-warning "binary constants" } */
#if 0B101 /* { dg-warning "binary constants" } */
#endif

View File

@ -0,0 +1,11 @@
/* Test that binary constants are diagnosed in C11 mode: -pedantic-errors. */
/* { dg-do compile } */
/* { dg-options "-std=c11 -pedantic-errors" } */
int a = 0b1; /* { dg-error "binary constants" } */
#if 0b101 /* { dg-error "binary constants" } */
#endif
int b = 0B1; /* { dg-error "binary constants" } */
#if 0B101 /* { dg-error "binary constants" } */
#endif

View File

@ -0,0 +1,5 @@
/* Test C2x binary constants. Valid syntax and types. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -pedantic-errors" } */
#include "binary-constants-1.c"

View File

@ -0,0 +1,11 @@
/* Test that binary constants are accepted in C2X mode: compat warnings. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -Wc11-c2x-compat" } */
int a = 0b1; /* { dg-warning "C2X feature" } */
#if 0b101 /* { dg-warning "C2X feature" } */
#endif
int b = 0B1; /* { dg-warning "C2X feature" } */
#if 0B101 /* { dg-warning "C2X feature" } */
#endif

View File

@ -0,0 +1,9 @@
/* Test C2x binary constants. Invalid constants. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -pedantic-errors" } */
int a = 0b; /* { dg-error "invalid suffix" } */
int b = 0B2; /* { dg-error "invalid suffix" } */
int c = 0B02; /* { dg-error "invalid digit" } */
int d = 0b1.1; /* { dg-error "invalid prefix" } */
int e = 0B0p0; /* { dg-error "invalid suffix" } */

View File

@ -14,5 +14,5 @@ foo (void)
warning. */
return 23;
#endif
return 0b1101; /* { dg-warning "binary constants are a GCC extension" } */
return 0b1101; /* { dg-warning "binary constants are a C2X feature or GCC extension" } */
}

View File

@ -812,14 +812,21 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
"imaginary constants are a GCC extension");
if (radix == 2
&& !CPP_OPTION (pfile, binary_constants)
&& CPP_PEDANTIC (pfile))
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
CPP_OPTION (pfile, cplusplus)
? N_("binary constants are a C++14 feature "
"or GCC extension")
: N_("binary constants are a GCC extension"));
if (radix == 2)
{
if (!CPP_OPTION (pfile, binary_constants)
&& CPP_PEDANTIC (pfile))
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
CPP_OPTION (pfile, cplusplus)
? N_("binary constants are a C++14 feature "
"or GCC extension")
: N_("binary constants are a C2X feature "
"or GCC extension"));
else if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
virtual_location, 0,
"binary constants are a C2X feature");
}
if (radix == 10)
result |= CPP_N_DECIMAL;

View File

@ -102,13 +102,13 @@ static const struct lang_flags lang_defaults[] =
/* GNUC99 */ { 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0 },
/* GNUC11 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0 },
/* GNUC17 */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0 },
/* GNUC2X */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 },
/* GNUC2X */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1 },
/* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
/* STDC94 */ { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
/* STDC99 */ { 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
/* STDC11 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
/* STDC17 */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
/* STDC2X */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1 },
/* STDC2X */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 },
/* GNUCXX */ { 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
/* CXX98 */ { 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0 },
/* GNUCXX11 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0 },