From fc753aa012d58f1269f05718d3a083dbac0b95c6 Mon Sep 17 00:00:00 2001 From: emsr Date: Tue, 17 Mar 2015 00:50:55 +0000 Subject: [PATCH] libcpp/ 2015-03-16 Edward Smith-Rowland <3dw4rd@verizon.net> PR c++/64626 * lex.c (lex_number): If a number ends with digit-seps (') skip back and let lex_string take them. gcc/testsuite/ 2015-03-16 Edward Smith-Rowland <3dw4rd@verizon.net> PR c++/64626 g++.dg/cpp1y/pr64626-1.C: New. g++.dg/cpp1y/pr64626-2.C: New. g++.dg/cpp1y/digit-sep-neg.C: Adjust errors and warnings. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221470 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C | 10 +++++++--- gcc/testsuite/g++.dg/cpp1y/pr64626-1.C | 20 ++++++++++++++++++++ gcc/testsuite/g++.dg/cpp1y/pr64626-2.C | 11 +++++++++++ libcpp/ChangeLog | 6 ++++++ libcpp/lex.c | 3 +++ 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/pr64626-1.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/pr64626-2.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bf995c79f45..c8c54c78819 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-03-16 Edward Smith-Rowland <3dw4rd@verizon.net> + + PR c++/64626 + g++.dg/cpp1y/pr64626-1.C: New. + g++.dg/cpp1y/pr64626-2.C: New. + g++.dg/cpp1y/digit-sep-neg.C: Adjust errors and warnings. + 2015-03-16 Jakub Jelinek PR tree-optimization/65427 diff --git a/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C b/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C index 3d4c616ccb1..54e5ed19cdc 100644 --- a/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C +++ b/gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C @@ -10,7 +10,7 @@ main() 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" } + i = 0b0001'0000'0000'0000'0000'0000'; // { dg-error "missing terminating" } unsigned u = 0b0001'0000'0000'0000'0000'0000'U; // { dg-error "digit separator outside digit sequence" } double d = 0.0; @@ -18,9 +18,13 @@ main() 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 "missing terminating" } 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" } + d = 1.602'176'565e-19'; // { dg-error "missing terminating" } float f = 1.602'176'565e-19'F; // { dg-error "digit separator outside digit sequence" } } + +// { dg-error "exponent has no digits" "exponent has no digits" { target *-*-* } 21 } +// { dg-error "expected ';' before" "expected ';' before" { target *-*-* } 14 } +// { dg-error "expected ';' before" "expected ';' before" { target *-*-* } 25 } diff --git a/gcc/testsuite/g++.dg/cpp1y/pr64626-1.C b/gcc/testsuite/g++.dg/cpp1y/pr64626-1.C new file mode 100644 index 00000000000..07af9f0a015 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr64626-1.C @@ -0,0 +1,20 @@ +// PR c++/64626 +// { dg-do compile { target c++14 } } + +#define STR(s) #s +int +main() +{ + int i = 1'2; + const char *s[3] + { + STR(1' '), + STR(..), + STR(%:%), + }; +} +#if 0 +1' ' +.. +%:% +#endif diff --git a/gcc/testsuite/g++.dg/cpp1y/pr64626-2.C b/gcc/testsuite/g++.dg/cpp1y/pr64626-2.C new file mode 100644 index 00000000000..62c3546718c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr64626-2.C @@ -0,0 +1,11 @@ +// PR c++/64626 +// { dg-do compile { target c++14 } } + +0''; // { dg-error "empty character constant" } + +123'''; // { dg-error "empty character constant" } + +// { dg-error "expected unqualified-id" "expected unqualified-id" { target *-*-* } 4 } + +// { dg-error "missing terminating" "missing terminating" { target *-*-* } 6 } +// { dg-error "expected unqualified-id" "expected unqualified-id" { target *-*-* } 6 } diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 2d84835b7b7..c7599495282 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,9 @@ +2015-03-16 Edward Smith-Rowland <3dw4rd@verizon.net> + + PR c++/64626 + * lex.c (lex_number): If a number ends with digit-seps (') skip back + and let lex_string take them. + 2015-03-02 Markus Trippelsdorf PR target/65261 diff --git a/libcpp/lex.c b/libcpp/lex.c index 0dc47371183..bca56299132 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -1400,6 +1400,9 @@ lex_number (cpp_reader *pfile, cpp_string *number, NORMALIZE_STATE_UPDATE_IDNUM (nst, *cur); cur++; } + /* A number can't end with a digit separator. */ + while (cur > pfile->buffer->cur && DIGIT_SEP (cur[-1])) + --cur; pfile->buffer->cur = cur; } -- 2.11.4.GIT