Commit 01187df0 by Jakub Jelinek Committed by Jakub Jelinek

N3472 binary constants

	N3472 binary constants
	* include/cpplib.h (struct cpp_options): Fix a typo in user_literals
	field comment.  Add binary_constants field.
	* init.c (struct lang_flags): Add binary_constants field.
	(lang_defaults): Add bin_cst column to the table.
	(cpp_set_lang): Initialize CPP_OPTION (pfile, binary_constants).
	* expr.c (cpp_classify_number): Talk about C++11 instead of C++0x
	in diagnostics.  Accept binary constants if
	CPP_OPTION (pfile, binary_constants) even when pedantic.  Adjust
	pedwarn message.

	* g++.dg/cpp/limits.C: Adjust warning wording.
	* g++.dg/system-binary-constants-1.C: Likewise.
	* g++.dg/cpp1y/system-binary-constants-1.C: New test.

From-SVN: r198380
parent 5e67a369
2013-04-28 Jakub Jelinek <jakub@redhat.com>
N3472 binary constants
* g++.dg/cpp/limits.C: Adjust warning wording.
* g++.dg/system-binary-constants-1.C: Likewise.
* g++.dg/cpp1y/system-binary-constants-1.C: New test.
2013-04-28 Tobias Burnus <burnus@net-b.de> 2013-04-28 Tobias Burnus <burnus@net-b.de>
PR fortran/57093 PR fortran/57093
......
...@@ -4,13 +4,13 @@ ...@@ -4,13 +4,13 @@
#include <limits> #include <limits>
// Compiling this with -pedantic was wrongly triggering this error: // Compiling this with -pedantic was wrongly triggering this error:
// libstdc++-v3/include/limits:1269:45: warning : use of C++0x long long integer constant [-Wlong-long] // libstdc++-v3/include/limits:1269:45: warning : use of C++11 long long integer constant [-Wlong-long]
// min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; } // min() _GLIBCXX_USE_NOEXCEPT { return -__LONG_LONG_MAX__ - 1; }
// ^ // ^
// libstdc++-v3/include/limits:1272:44: warning : use of C++0x long long integer constant [-Wlong-long] // libstdc++-v3/include/limits:1272:44: warning : use of C++11 long long integer constant [-Wlong-long]
// max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; } // max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__; }
// ^ // ^
// libstdc++-v3/include/limits:1342:44: warning : use of C++0x long long integer constant [-Wlong-long] // libstdc++-v3/include/limits:1342:44: warning : use of C++11 long long integer constant [-Wlong-long]
// max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL + 1 // max() _GLIBCXX_USE_NOEXCEPT { return __LONG_LONG_MAX__ * 2ULL + 1
// ^ // ^
......
// Origin: Dodji Seketeli <dodji@redhat.com>
// { dg-options "-std=c++1y -pedantic-errors" }
// { dg-do compile }
#include "../system-binary-constants-1.h"
int
foo (void)
{
#if BINARY_INT_CONSTANT_IN_SYSTEM_HEADER
return 23;
#endif
return 0b1101; // { dg-bogus "binary constants are a C..1y feature or GCC extension" }
}
...@@ -14,5 +14,5 @@ foo (void) ...@@ -14,5 +14,5 @@ foo (void)
warning. */ warning. */
return 23; return 23;
#endif #endif
return 0b1101; /* { dg-warning "binary constants are a GCC extension" } */ return 0b1101; /* { dg-warning "binary constants are a C..1y feature or GCC extension" } */
} }
2013-04-28 Jakub Jelinek <jakub@redhat.com>
N3472 binary constants
* include/cpplib.h (struct cpp_options): Fix a typo in user_literals
field comment. Add binary_constants field.
* init.c (struct lang_flags): Add binary_constants field.
(lang_defaults): Add bin_cst column to the table.
(cpp_set_lang): Initialize CPP_OPTION (pfile, binary_constants).
* expr.c (cpp_classify_number): Talk about C++11 instead of C++0x
in diagnostics. Accept binary constants if
CPP_OPTION (pfile, binary_constants) even when pedantic. Adjust
pedwarn message.
2013-04-24 Paolo Carlini <paolo.carlini@oracle.com> 2013-04-24 Paolo Carlini <paolo.carlini@oracle.com>
* include/cpplib.h (enum c_lang): Add CLK_GNUCXX1Y and CLK_CXX1Y. * include/cpplib.h (enum c_lang): Add CLK_GNUCXX1Y and CLK_CXX1Y.
......
...@@ -621,7 +621,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, ...@@ -621,7 +621,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
&& CPP_OPTION (pfile, cpp_warn_long_long)) && CPP_OPTION (pfile, cpp_warn_long_long))
{ {
const char *message = CPP_OPTION (pfile, cplusplus) const char *message = CPP_OPTION (pfile, cplusplus)
? N_("use of C++0x long long integer constant") ? N_("use of C++11 long long integer constant")
: N_("use of C99 long long integer constant"); : N_("use of C99 long long integer constant");
if (CPP_OPTION (pfile, c99)) if (CPP_OPTION (pfile, c99))
...@@ -639,9 +639,14 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token, ...@@ -639,9 +639,14 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile)) if ((result & CPP_N_IMAGINARY) && CPP_PEDANTIC (pfile))
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
"imaginary constants are a GCC extension"); "imaginary constants are a GCC extension");
if (radix == 2 && CPP_PEDANTIC (pfile)) if (radix == 2
&& !CPP_OPTION (pfile, binary_constants)
&& CPP_PEDANTIC (pfile))
cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0, cpp_error_with_line (pfile, CPP_DL_PEDWARN, virtual_location, 0,
"binary constants are a GCC extension"); CPP_OPTION (pfile, cplusplus)
? "binary constants are a C++1y feature "
"or GCC extension"
: "binary constants are a GCC extension");
if (radix == 10) if (radix == 10)
result |= CPP_N_DECIMAL; result |= CPP_N_DECIMAL;
......
...@@ -423,7 +423,7 @@ struct cpp_options ...@@ -423,7 +423,7 @@ struct cpp_options
/* True for traditional preprocessing. */ /* True for traditional preprocessing. */
unsigned char traditional; unsigned char traditional;
/* Nonzero for C++ 2011 Standard user-defnied literals. */ /* Nonzero for C++ 2011 Standard user-defined literals. */
unsigned char user_literals; unsigned char user_literals;
/* Nonzero means warn when a string or character literal is followed by a /* Nonzero means warn when a string or character literal is followed by a
...@@ -434,6 +434,9 @@ struct cpp_options ...@@ -434,6 +434,9 @@ struct cpp_options
literal number suffixes as user-defined literal number suffixes. */ literal number suffixes as user-defined literal number suffixes. */
unsigned char ext_numeric_literals; unsigned char ext_numeric_literals;
/* Nonzero for C++ 2014 Standard binary constants. */
unsigned char binary_constants;
/* Holds the name of the target (execution) character set. */ /* Holds the name of the target (execution) character set. */
const char *narrow_charset; const char *narrow_charset;
......
...@@ -83,24 +83,25 @@ struct lang_flags ...@@ -83,24 +83,25 @@ struct lang_flags
char uliterals; char uliterals;
char rliterals; char rliterals;
char user_literals; char user_literals;
char binary_constants;
}; };
static const struct lang_flags lang_defaults[] = static const struct lang_flags lang_defaults[] =
{ /* c99 c++ xnum xid std // digr ulit rlit user_literals */ { /* c99 c++ xnum xid std // digr ulit rlit udlit bin_cst */
/* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0, 0, 0 }, /* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0 },
/* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1, 1, 0 }, /* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
/* GNUC11 */ { 1, 0, 1, 0, 0, 1, 1, 1, 1, 0 }, /* GNUC11 */ { 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
/* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, /* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
/* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0 }, /* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0 },
/* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0, 0, 0 }, /* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0 },
/* STDC11 */ { 1, 0, 1, 0, 1, 1, 1, 1, 0, 0 }, /* STDC11 */ { 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0 },
/* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0, 0, 0 }, /* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0 },
/* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0, 0, 0 }, /* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0 },
/* GNUCXX11 */ { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1 }, /* GNUCXX11 */ { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0 },
/* CXX11 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }, /* CXX11 */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0 },
/* GNUCXX1Y */ { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1 }, /* GNUCXX1Y */ { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1 },
/* CXX1Y */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 }, /* CXX1Y */ { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 },
/* ASM */ { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 } /* ASM */ { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0 }
/* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX11, CXX11, /* xid should be 1 for GNUC99, STDC99, GNUCXX, CXX98, GNUCXX11, CXX11,
GNUCXX1Y, and CXX1Y when no longer experimental (when all uses of GNUCXX1Y, and CXX1Y when no longer experimental (when all uses of
identifiers in the compiler have been audited for correct handling identifiers in the compiler have been audited for correct handling
...@@ -126,6 +127,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang) ...@@ -126,6 +127,7 @@ cpp_set_lang (cpp_reader *pfile, enum c_lang lang)
CPP_OPTION (pfile, uliterals) = l->uliterals; CPP_OPTION (pfile, uliterals) = l->uliterals;
CPP_OPTION (pfile, rliterals) = l->rliterals; CPP_OPTION (pfile, rliterals) = l->rliterals;
CPP_OPTION (pfile, user_literals) = l->user_literals; CPP_OPTION (pfile, user_literals) = l->user_literals;
CPP_OPTION (pfile, binary_constants) = l->binary_constants;
} }
/* Initialize library global state. */ /* Initialize library global state. */
......
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