I just look to see if a lexed number in libcpp ends in a '. If so, back up one character and let string processing handle it.
I get one warning and one error for each instance but I'd rather not error when it should pass.
Built and tests clean on x86_64-linux. OK?
libcpp/ 2015-03-09 Edward Smith-Rowland <3dw...@verizon.net> PR c++/64626 * expr.c (parse_has_attribute): New function; (eval_token): Look for __has_attribute__ and route to parse_has_attribute. gcc/testsuite/ 2015-03-09 Edward Smith-Rowland <3dw...@verizon.net> PR c++/64626 g++.dg/cpp1y/pr64626.C: New. g++.dg/cpp1y/digit-sep-neg.C: Adjust errors and warnings.
Index: libcpp/lex.c =================================================================== --- libcpp/lex.c (revision 221218) +++ libcpp/lex.c (working copy) @@ -1400,6 +1400,9 @@ NORMALIZE_STATE_UPDATE_IDNUM (nst, *cur); cur++; } + /* A number can't end with a digit separator. */ + if (DIGIT_SEP (cur[-1])) + --cur; pfile->buffer->cur = cur; } Index: gcc/testsuite/g++.dg/cpp1y/pr64626.C =================================================================== --- gcc/testsuite/g++.dg/cpp1y/pr64626.C (revision 0) +++ gcc/testsuite/g++.dg/cpp1y/pr64626.C (working copy) @@ -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 Index: gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C =================================================================== --- gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C (revision 221218) +++ gcc/testsuite/g++.dg/cpp1y/digit-sep-neg.C (working copy) @@ -10,7 +10,7 @@ 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,15 @@ 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-warning "missing terminating" { target *-*-* } 13 } + +// { dg-warning "missing terminating" { target *-*-* } 21 } + +// { dg-warning "missing terminating" { target *-*-* } 24 }