diff --git a/gcc/testsuite/g++.dg/cpp1y/digit-sep-line-neg.C b/gcc/testsuite/g++.dg/cpp1y/digit-sep-line-neg.C new file mode 100644 index 00000000000..fa3b1352109 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/digit-sep-line-neg.C @@ -0,0 +1,4 @@ +// Test digit separators in #line (bug 82359). Test invalid usage. +// { dg-do preprocess { target c++14 } } + +#line 0''123 // { dg-error "is not a positive integer" } diff --git a/gcc/testsuite/g++.dg/cpp1y/digit-sep-line.C b/gcc/testsuite/g++.dg/cpp1y/digit-sep-line.C new file mode 100644 index 00000000000..48846e42221 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/digit-sep-line.C @@ -0,0 +1,8 @@ +// Test digit separators in #line (bug 82359). +// { dg-do compile { target c++14 } } + +#line 0'123 +static_assert (__LINE__ == 123, "#line with digit separator"); + +#line 4'56'7'8'9 +static_assert (__LINE__ == 456789, "#line with digit separator"); diff --git a/libcpp/directives.c b/libcpp/directives.c index f4aa17d1156..795f93e664b 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -922,12 +922,19 @@ strtolinenum (const uchar *str, size_t len, linenum_type *nump, bool *wrapped) linenum_type reg = 0; uchar c; + bool seen_digit_sep = false; *wrapped = false; while (len--) { c = *str++; + if (!seen_digit_sep && c == '\'' && len) + { + seen_digit_sep = true; + continue; + } if (!ISDIGIT (c)) return true; + seen_digit_sep = false; if (reg > ((linenum_type) -1) / 10) *wrapped = true; reg *= 10;