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:
parent
f3dc991fba
commit
e400a64936
@ -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" } */
|
||||
}
|
||||
|
@ -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" } */
|
||||
}
|
||||
|
11
gcc/testsuite/gcc.dg/c11-binary-constants-1.c
Normal file
11
gcc/testsuite/gcc.dg/c11-binary-constants-1.c
Normal 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
|
11
gcc/testsuite/gcc.dg/c11-binary-constants-2.c
Normal file
11
gcc/testsuite/gcc.dg/c11-binary-constants-2.c
Normal 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
|
5
gcc/testsuite/gcc.dg/c2x-binary-constants-1.c
Normal file
5
gcc/testsuite/gcc.dg/c2x-binary-constants-1.c
Normal 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"
|
11
gcc/testsuite/gcc.dg/c2x-binary-constants-2.c
Normal file
11
gcc/testsuite/gcc.dg/c2x-binary-constants-2.c
Normal 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
|
9
gcc/testsuite/gcc.dg/c2x-binary-constants-3.c
Normal file
9
gcc/testsuite/gcc.dg/c2x-binary-constants-3.c
Normal 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" } */
|
@ -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" } */
|
||||
}
|
||||
|
@ -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)
|
||||
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 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;
|
||||
|
@ -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 },
|
||||
|
Loading…
Reference in New Issue
Block a user