aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEdward Smith-Rowland <3dw4rd@verizon.net>2013-10-31 14:01:23 +0000
committerEdward Smith-Rowland <emsr@gcc.gnu.org>2013-10-31 14:01:23 +0000
commit7057e6452ba6b205085eede49eddf37c2feab29a (patch)
tree28dc58242b9d84a0f1723c9f24e40c623e194ef1 /gcc
parentb63cb15373bf384f1d644c4cfae0c60422cc3909 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/c-family/c-lex.c15
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/digit-sep-cxx11-neg.C12
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C26
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/digit-sep.C22
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);
+}