aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/digit-sep-line-neg.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/digit-sep-line.C8
-rw-r--r--libcpp/directives.c7
3 files changed, 19 insertions, 0 deletions
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 0000000..fa3b135
--- /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 0000000..48846e4
--- /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 f4aa17d..795f93e 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;