diff options
author | Edward Smith-Rowland <3dw4rd@verizon.net> | 2013-10-31 14:01:23 +0000 |
---|---|---|
committer | Edward Smith-Rowland <emsr@gcc.gnu.org> | 2013-10-31 14:01:23 +0000 |
commit | 7057e6452ba6b205085eede49eddf37c2feab29a (patch) | |
tree | 28dc58242b9d84a0f1723c9f24e40c623e194ef1 /gcc | |
parent | b63cb15373bf384f1d644c4cfae0c60422cc3909 (diff) | |
download | gcc-7057e6452ba6b205085eede49eddf37c2feab29a.zip gcc-7057e6452ba6b205085eede49eddf37c2feab29a.tar.gz gcc-7057e6452ba6b205085eede49eddf37c2feab29a.tar.bz2 |
Implement C++14 digit separators.
libcpp:
2013-10-31 Edward Smith-Rowland <3dw4rd@verizon.net>
Implement C++14 digit separators.
* include/cpplib.h (cpp_options): Add digit_separators flag.
* internal.h (DIGIT_SEP(c)): New macro.
* expr.c (cpp_classify_number): Check improper placement of digit sep;
(cpp_interpret_integer): Skip over digit separators.
* init.c (lang_flags): Add digit_separators flag; (lang_defaults): Add
digit separator flags per language; (cpp_set_lang): Set
digit_separators
* lex.c (lex_number): Add digits separator to allowable characters for
C++14.
gcc/c-family:
2013-10-31 Edward Smith-Rowland <3dw4rd@verizon.net>
Implement C++14 digit separators.
* c-lex.c (interpret_float): Remove digit separators from scratch string
before building real literal.
gcc/testsuite:
2013-10-31 Edward Smith-Rowland <3dw4rd@verizon.net>
Implement C++14 digit separators.
* g++.dg/cpp1y/digit-sep.C: New.
* g++.dg/cpp1y/digit-sep-neg.C: New.
* g++.dg/cpp1y/digit-sep-cxx11-neg.C: New.
libstdc++-v3:
2013-10-31 Edward Smith-Rowland <3dw4rd@verizon.net>
Implement C++14 digit separators.
* include/include/bits/parse_numbers.h: Change struct _Digit<_Base, '`'>
to struct _Digit<_Base, '\''>.
From-SVN: r204260
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-family/c-lex.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C | 26 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/digit-sep.C | 22 |
6 files changed, 86 insertions, 2 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index ff1ce5b..3fa9d13 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,9 @@ +2013-10-31 Edward Smith-Rowland <3dw4rd@verizon.net> + + Implement C++14 digit separators. + * c-lex.c (interpret_float): Remove digit separators from scratch string + before building real literal. + 2013-10-30 Jakub Jelinek <jakub@redhat.com> * cilk.c (create_cilk_helper_decl): Use HOST_WIDE_INT_PRINT_DEC. diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c index 4dfd5d9..6484352 100644 --- a/gcc/c-family/c-lex.c +++ b/gcc/c-family/c-lex.c @@ -774,8 +774,19 @@ interpret_float (const cpp_token *token, unsigned int flags, } copy = (char *) alloca (copylen + 1); - memcpy (copy, token->val.str.text, copylen); - copy[copylen] = '\0'; + if (cxx_dialect > cxx11) + { + size_t maxlen = 0; + for (size_t i = 0; i < copylen; ++i) + if (token->val.str.text[i] != '\'') + copy[maxlen++] = token->val.str.text[i]; + copy[maxlen] = '\0'; + } + else + { + memcpy (copy, token->val.str.text, copylen); + copy[copylen] = '\0'; + } real_from_string3 (&real, copy, TYPE_MODE (const_type)); if (const_type != type) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 261e2e2..7283dbe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-10-31 Edward Smith-Rowland <3dw4rd@verizon.net> + + Implement C++14 digit separators. + * g++.dg/cpp1y/digit-sep.C: New. + * g++.dg/cpp1y/digit-sep-neg.C: New. + * g++.dg/cpp1y/digit-sep-cxx11-neg.C: New. + 2013-10-31 Jakub Jelinek <jakub@redhat.com> * gcc.dg/vect/vect-align-3.c: New test. diff --git a/gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C b/gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C new file mode 100644 index 0000000..a078fa2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C @@ -0,0 +1,12 @@ +// { dg-options -std=c++11 } + +#define assert(E) if(!(E))__builtin_abort(); + +#define m(x) 0 + +int +main() +{ + int i = m(1'2)+(3'4); + assert(i == 0); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C b/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C new file mode 100644 index 0000000..371e675 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C @@ -0,0 +1,26 @@ +// { dg-options -std=c++1y } + +int +main() +{ + int i = 0; + i = 1048''576; // { dg-error "adjacent digit separators" } + i = 0X'100000; // { dg-error "digit separator after base indicator" } + i = 0x'100000; // { dg-error "digit separator after base indicator" } + i = 0004''000'000); // { dg-error "adjacent digit separators" } + i = 0B1'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0'0; // OK + i = 0b'0001'0000'0000'0000'0000'0000; // { dg-error "digit separator after base indicator" } + i = 0b0001'0000'0000'0000'0000'0000'; // { dg-error "digit separator outside digit sequence" } + unsigned u = 0b0001'0000'0000'0000'0000'0000'U; // { dg-error "digit separator outside digit sequence" } + + double d = 0.0; + d = 1'.602'176'565e-19; // { dg-error "digit separator adjacent to decimal point" } + d = 1.'602'176'565e-19; // { dg-error "digit separator adjacent to decimal point" } + d = 1.602''176'565e-19; // { dg-error "adjacent digit separators" } + d = 1.602'176'565'e-19; // { dg-error "digit separator adjacent to exponent" } + d = 1.602'176'565e'-19; // { dg-error "digit separator adjacent to exponent" } + d = 1.602'176'565e-'19; // { dg-error "digit separator adjacent to exponent" } + d = 1.602'176'565e-1'9; // OK + d = 1.602'176'565e-19'; // { dg-error "digit separator outside digit sequence" } + float f = 1.602'176'565e-19'F; // { dg-error "digit separator outside digit sequence" } +} diff --git a/gcc/testsuite/g++.dg/cpp1y/digit-sep.C b/gcc/testsuite/g++.dg/cpp1y/digit-sep.C new file mode 100644 index 0000000..69b1c69 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/digit-sep.C @@ -0,0 +1,22 @@ +// { dg-options -std=c++1y } + +#define assert(E) if(!(E))__builtin_abort(); + +#define m(x) 0 + +int +main() +{ + assert(1048576 == 1'048'576); + assert(1048576 == 0X100000); + assert(1048576 == 0x10'0000); + assert(1048576 == 0'004'000'000); + assert(1048576 == 0B100000000000000000000); + assert(1048576 == 0b0001'0000'0000'0000'0000'0000); + + assert(1.602'176'565e-19 == 1.602176565e-19); + assert(1.602'176'565e-1'9 == 1.602176565e-19); + + int i = m(1'2)+(3'4); + assert(i == 34); +} |