Commit 175a85b2 by Joseph Myers Committed by Joseph Myers

Support decimal floating-point constants in C2x.

ISO C2x adds decimal floating point as an optional standard feature.
This patch accordingly makes GCC accept DFP constants (DF, DD, DL, df,
dd, dl suffixes) in strict C2X mode, with a pedwarn-if-pedantic for
older standards and a warning with -Wc11-c2x-compat even in C2x mode
(which in turn requires -Wc11-c2x-compat to be newly passed through to
libcpp).

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

gcc/c-family:
	* c.opt (Wc11-c2x-compat): Add CPP(cpp_warn_c11_c2x_compat)
	CppReason(CPP_W_C11_C2X_COMPAT).

gcc/testsuite:
	* gcc.dg/dfp/c11-constants-1.c, gcc.dg/dfp/c11-constants-2.c,
	gcc.dg/dfp/c2x-constants-1.c, gcc.dg/dfp/c2x-constants-2.c: New
	tests.
	* gcc.dg/dfp/constants-pedantic.c: Use -std=gnu17 explicitly.
	Update expected diagnostics.

libcpp:
	* include/cpplib.h (struct cpp_options): Add dfp_constants and
	cpp_warn_c11_c2x_compat.
	(enum cpp_warning_reason): Add CPP_W_C11_C2X_COMPAT.
	* init.c (struct lang_flags): Add dfp_constants.
	(lang_defaults): Set dfp_constants to 1 for GNUC2X and STDC2X and
	0 for other languages.
	(cpp_set_lang): Set dfp_constants from language.
	(cpp_create_reader): Set cpp_warn_c11_c2x_compat to -1.
	* expr.c (interpret_float_suffix): Mention DFP constants as C2X in
	comment.
	(cpp_classify_number): Do not diagnose DFP constants for languages
	setting dfp_constants, unless cpp_warn_c11_c2x_compat.

From-SVN: r276908
parent 53f3c1a1
2019-10-11 Joseph Myers <joseph@codesourcery.com> 2019-10-11 Joseph Myers <joseph@codesourcery.com>
* c.opt (Wc11-c2x-compat): Add CPP(cpp_warn_c11_c2x_compat)
CppReason(CPP_W_C11_C2X_COMPAT).
2019-10-11 Joseph Myers <joseph@codesourcery.com>
* c-common.c (c_common_reswords): Do not use D_EXT for _Decimal32, * c-common.c (c_common_reswords): Do not use D_EXT for _Decimal32,
_Decimal64 and _Decimal128. _Decimal64 and _Decimal128.
......
...@@ -367,7 +367,7 @@ C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) CppReason(CPP_W_BUILTIN_MACR ...@@ -367,7 +367,7 @@ C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) CppReason(CPP_W_BUILTIN_MACR
Warn when a built-in preprocessor macro is undefined or redefined. Warn when a built-in preprocessor macro is undefined or redefined.
Wc11-c2x-compat Wc11-c2x-compat
C ObjC Var(warn_c11_c2x_compat) Init(-1) Warning C ObjC CPP(cpp_warn_c11_c2x_compat) CppReason(CPP_W_C11_C2X_COMPAT) Var(warn_c11_c2x_compat) Init(-1) Warning
Warn about features not present in ISO C11, but present in ISO C2X. Warn about features not present in ISO C11, but present in ISO C2X.
Wc90-c99-compat Wc90-c99-compat
......
2019-10-11 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/dfp/c11-constants-1.c, gcc.dg/dfp/c11-constants-2.c,
gcc.dg/dfp/c2x-constants-1.c, gcc.dg/dfp/c2x-constants-2.c: New
tests.
* gcc.dg/dfp/constants-pedantic.c: Use -std=gnu17 explicitly.
Update expected diagnostics.
2019-10-11 Marek Polacek <polacek@redhat.com> 2019-10-11 Marek Polacek <polacek@redhat.com>
PR c++/92070 - bogus error with -fchecking=2. PR c++/92070 - bogus error with -fchecking=2.
......
/* Test that DFP constants are diagnosed in C11 mode: -pedantic. */
/* { dg-do compile } */
/* { dg-options "-std=c11 -pedantic" } */
int a = (int) 1.1DF; /* { dg-warning "C2X feature" } */
int b = (int) 2.df; /* { dg-warning "C2X feature" } */
int c = (int) .33DD; /* { dg-warning "C2X feature" } */
int d = (int) 2e1dd; /* { dg-warning "C2X feature" } */
int e = (int) .3e2DL; /* { dg-warning "C2X feature" } */
int f = (int) 4.5e3dl; /* { dg-warning "C2X feature" } */
int g = (int) 5.e0DF; /* { dg-warning "C2X feature" } */
int h = (int) 1e+2df; /* { dg-warning "C2X feature" } */
int i = (int) 1000e-3DL; /* { dg-warning "C2X feature" } */
/* Test that DFP constants are diagnosed in C11 mode: -pedantic-errors. */
/* { dg-do compile } */
/* { dg-options "-std=c11 -pedantic-errors" } */
int a = (int) 1.1DF; /* { dg-error "C2X feature" } */
int b = (int) 2.df; /* { dg-error "C2X feature" } */
int c = (int) .33DD; /* { dg-error "C2X feature" } */
int d = (int) 2e1dd; /* { dg-error "C2X feature" } */
int e = (int) .3e2DL; /* { dg-error "C2X feature" } */
int f = (int) 4.5e3dl; /* { dg-error "C2X feature" } */
int g = (int) 5.e0DF; /* { dg-error "C2X feature" } */
int h = (int) 1e+2df; /* { dg-error "C2X feature" } */
int i = (int) 1000e-3DL; /* { dg-error "C2X feature" } */
/* Test that DFP constants are accepted in C2X mode. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -pedantic-errors" } */
int a = (int) 1.1DF;
int b = (int) 2.df;
int c = (int) .33DD;
int d = (int) 2e1dd;
int e = (int) .3e2DL;
int f = (int) 4.5e3dl;
int g = (int) 5.e0DF;
int h = (int) 1e+2df;
int i = (int) 1000e-3DL;
/* Test that DFP constants are accepted in C2X mode: compat warnings. */
/* { dg-do compile } */
/* { dg-options "-std=c2x -Wc11-c2x-compat" } */
int a = (int) 1.1DF; /* { dg-warning "C2X feature" } */
int b = (int) 2.df; /* { dg-warning "C2X feature" } */
int c = (int) .33DD; /* { dg-warning "C2X feature" } */
int d = (int) 2e1dd; /* { dg-warning "C2X feature" } */
int e = (int) .3e2DL; /* { dg-warning "C2X feature" } */
int f = (int) 4.5e3dl; /* { dg-warning "C2X feature" } */
int g = (int) 5.e0DF; /* { dg-warning "C2X feature" } */
int h = (int) 1e+2df; /* { dg-warning "C2X feature" } */
int i = (int) 1000e-3DL; /* { dg-warning "C2X feature" } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-pedantic" } */ /* { dg-options "-std=gnu17 -pedantic" } */
/* N1150 6: Constants. /* N1150 6: Constants.
C99 6.4.4.2: Floating constants. */ C99 6.4.4.2: Floating constants. */
#include "dfp-dbg.h" #include "dfp-dbg.h"
_Decimal32 a = 1.1df; /* { dg-warning "GCC extension|ISO C" } */ _Decimal32 a = 1.1df; /* { dg-warning "C2X feature|ISO C" } */
_Decimal32 b = -.003DF; /* { dg-warning "GCC extension|ISO C" } */ _Decimal32 b = -.003DF; /* { dg-warning "C2X feature|ISO C" } */
_Decimal64 c = 11e-1dl; /* { dg-warning "GCC extension|ISO C" } */ _Decimal64 c = 11e-1dl; /* { dg-warning "C2X feature|ISO C" } */
_Decimal64 d = -.3DL; /* { dg-warning "GCC extension|ISO C" } */ _Decimal64 d = -.3DL; /* { dg-warning "C2X feature|ISO C" } */
_Decimal128 e = 000.3e0dl; /* { dg-warning "GCC extension|ISO C" } */ _Decimal128 e = 000.3e0dl; /* { dg-warning "C2X feature|ISO C" } */
_Decimal128 f = 3000300030003e0DL; /* { dg-warning "GCC extension|ISO C" } */ _Decimal128 f = 3000300030003e0DL; /* { dg-warning "C2X feature|ISO C" } */
2019-10-11 Joseph Myers <joseph@codesourcery.com>
* include/cpplib.h (struct cpp_options): Add dfp_constants and
cpp_warn_c11_c2x_compat.
(enum cpp_warning_reason): Add CPP_W_C11_C2X_COMPAT.
* init.c (struct lang_flags): Add dfp_constants.
(lang_defaults): Set dfp_constants to 1 for GNUC2X and STDC2X and
0 for other languages.
(cpp_set_lang): Set dfp_constants from language.
(cpp_create_reader): Set cpp_warn_c11_c2x_compat to -1.
* expr.c (interpret_float_suffix): Mention DFP constants as C2X in
comment.
(cpp_classify_number): Do not diagnose DFP constants for languages
setting dfp_constants, unless cpp_warn_c11_c2x_compat.
2019-10-04 Nathan Sidwell <nathan@acm.org> 2019-10-04 Nathan Sidwell <nathan@acm.org>
PR preprocessor/91991 PR preprocessor/91991
......
...@@ -98,8 +98,8 @@ interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len) ...@@ -98,8 +98,8 @@ interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len)
flags = 0; flags = 0;
f = d = l = w = q = i = fn = fnx = fn_bits = 0; f = d = l = w = q = i = fn = fnx = fn_bits = 0;
/* The following decimal float suffixes, from TR 24732:2009 and TS /* The following decimal float suffixes, from TR 24732:2009, TS
18661-2:2015, are supported: 18661-2:2015 and C2X, are supported:
df, DF - _Decimal32. df, DF - _Decimal32.
dd, DD - _Decimal64. dd, DD - _Decimal64.
...@@ -744,9 +744,16 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, ...@@ -744,9 +744,16 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
"fixed-point constants are a GCC extension"); "fixed-point constants are a GCC extension");
if ((result & CPP_N_DFLOAT) && CPP_PEDANTIC (pfile)) if (result & CPP_N_DFLOAT)
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, {
"decimal float constants are a GCC extension"); if (CPP_PEDANTIC (pfile) && !CPP_OPTION (pfile, dfp_constants))
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
"decimal float constants are a C2X feature");
else if (CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) > 0)
cpp_warning_with_line (pfile, CPP_W_C11_C2X_COMPAT,
virtual_location, 0,
"decimal float constants are a C2X feature");
}
result |= CPP_N_FLOATING; result |= CPP_N_FLOATING;
} }
......
...@@ -480,6 +480,9 @@ struct cpp_options ...@@ -480,6 +480,9 @@ struct cpp_options
/* Nonzero for C++ 2014 Standard digit separators. */ /* Nonzero for C++ 2014 Standard digit separators. */
unsigned char digit_separators; unsigned char digit_separators;
/* Nonzero for C2X decimal floating-point constants. */
unsigned char dfp_constants;
/* Nonzero for C++2a __VA_OPT__ feature. */ /* Nonzero for C++2a __VA_OPT__ feature. */
unsigned char va_opt; unsigned char va_opt;
...@@ -508,6 +511,9 @@ struct cpp_options ...@@ -508,6 +511,9 @@ struct cpp_options
/* True if warn about differences between C90 and C99. */ /* True if warn about differences between C90 and C99. */
signed char cpp_warn_c90_c99_compat; signed char cpp_warn_c90_c99_compat;
/* True if warn about differences between C11 and C2X. */
signed char cpp_warn_c11_c2x_compat;
/* True if warn about differences between C++98 and C++11. */ /* True if warn about differences between C++98 and C++11. */
bool cpp_warn_cxx11_compat; bool cpp_warn_cxx11_compat;
...@@ -607,6 +613,7 @@ enum cpp_warning_reason { ...@@ -607,6 +613,7 @@ enum cpp_warning_reason {
CPP_W_DATE_TIME, CPP_W_DATE_TIME,
CPP_W_PEDANTIC, CPP_W_PEDANTIC,
CPP_W_C90_C99_COMPAT, CPP_W_C90_C99_COMPAT,
CPP_W_C11_C2X_COMPAT,
CPP_W_CXX11_COMPAT, CPP_W_CXX11_COMPAT,
CPP_W_EXPANSION_TO_DEFINED CPP_W_EXPANSION_TO_DEFINED
}; };
......
...@@ -93,32 +93,33 @@ struct lang_flags ...@@ -93,32 +93,33 @@ struct lang_flags
char utf8_char_literals; char utf8_char_literals;
char va_opt; char va_opt;
char scope; char scope;
char dfp_constants;
}; };
static const struct lang_flags lang_defaults[] = static const struct lang_flags lang_defaults[] =
{ /* c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope*/ { /* c99 c++ xnum xid c11 std digr ulit rlit udlit bincst digsep trig u8chlit vaopt scope dfp */
/* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1 }, /* GNUC89 */ { 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
/* GNUC99 */ { 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1 }, /* 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 }, /* 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 }, /* 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, 0, 1, 1 }, /* GNUC2X */ { 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 },
/* STDC89 */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, /* 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 }, /* 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 }, /* 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 }, /* 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 }, /* 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, 0, 0, 1 }, /* STDC2X */ { 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1 },
/* GNUCXX */ { 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 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 }, /* 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 }, /* GNUCXX11 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0 },
/* CXX11 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1 }, /* CXX11 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0 },
/* GNUCXX14 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1 }, /* GNUCXX14 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0 },
/* CXX14 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1 }, /* CXX14 */ { 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0 },
/* GNUCXX17 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 }, /* GNUCXX17 */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
/* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1 }, /* CXX17 */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 },
/* GNUCXX2A */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 }, /* GNUCXX2A */ { 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
/* CXX2A */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1 }, /* CXX2A */ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 },
/* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } /* ASM */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
}; };
/* Sets internal flags correctly for a given language. */ /* Sets internal flags correctly for a given language. */
...@@ -145,6 +146,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang) ...@@ -145,6 +146,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
CPP_OPTION (pfile, utf8_char_literals) = l->utf8_char_literals; CPP_OPTION (pfile, utf8_char_literals) = l->utf8_char_literals;
CPP_OPTION (pfile, va_opt) = l->va_opt; CPP_OPTION (pfile, va_opt) = l->va_opt;
CPP_OPTION (pfile, scope) = l->scope; CPP_OPTION (pfile, scope) = l->scope;
CPP_OPTION (pfile, dfp_constants) = l->dfp_constants;
} }
/* Initialize library global state. */ /* Initialize library global state. */
...@@ -193,6 +195,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table, ...@@ -193,6 +195,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
CPP_OPTION (pfile, warn_trigraphs) = 2; CPP_OPTION (pfile, warn_trigraphs) = 2;
CPP_OPTION (pfile, warn_endif_labels) = 1; CPP_OPTION (pfile, warn_endif_labels) = 1;
CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1; CPP_OPTION (pfile, cpp_warn_c90_c99_compat) = -1;
CPP_OPTION (pfile, cpp_warn_c11_c2x_compat) = -1;
CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0; CPP_OPTION (pfile, cpp_warn_cxx11_compat) = 0;
CPP_OPTION (pfile, cpp_warn_deprecated) = 1; CPP_OPTION (pfile, cpp_warn_deprecated) = 1;
CPP_OPTION (pfile, cpp_warn_long_long) = 0; CPP_OPTION (pfile, cpp_warn_long_long) = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment