preprocessor: Fix #line overflow check [PR97602]
authorJoseph Myers <joseph@codesourcery.com>
Fri, 27 Nov 2020 22:40:01 +0000 (22:40 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Fri, 27 Nov 2020 22:40:01 +0000 (22:40 +0000)
commit9ccffd1298b5235b25ad05b89e3104fb2935fe27
treecf825ab7f1747bd8cc89e4583b7e8585ddc2b0ea
parent5dbab7b3f4d3a8298aeb8ecde1cfbc4b16913d28
preprocessor: Fix #line overflow check [PR97602]

The preprocessor check for overflow (of linenum_type = unsigned int)
when reading the line number in a #line directive is incomplete; it
checks "reg < reg_prev" which doesn't cover all cases where
multiplying by 10 overflowed.  Fix this by checking for overflow
before rather than after it occurs (using essentially the same logic
as used by e.g. glibc printf when reading width and precision values
from strings).

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

libcpp/
2020-11-27  Joseph Myers  <joseph@codesourcery.com>

PR preprocessor/97602
* directives.c (strtolinenum): Check for overflow before it
occurs.  Correct comment.

gcc/testsuite/
2020-11-27  Joseph Myers  <joseph@codesourcery.com>

PR preprocessor/97602
* gcc.dg/cpp/line9.c, gcc.dg/cpp/line10.c: New tests.
gcc/testsuite/gcc.dg/cpp/line10.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/line9.c [new file with mode: 0644]
libcpp/directives.c