https://gcc.gnu.org/g:102179f11d35705f384817d7edec32bbda22b2b7
commit r16-2758-g102179f11d35705f384817d7edec32bbda22b2b7 Author: Jakub Jelinek <ja...@redhat.com> Date: Mon Aug 4 15:28:29 2025 +0200 c++: Add #line testcase for CWG2580 [PR120778] Contrary to what the paper says, I think for #line directives we diagnose everything we should (sure, some diagnostics are pedwarns). 2025-08-04 Jakub Jelinek <ja...@redhat.com> PR preprocessor/120778 * g++.dg/DRs/dr2580.C: New test. Diff: --- gcc/testsuite/g++.dg/DRs/dr2580.C | 87 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/gcc/testsuite/g++.dg/DRs/dr2580.C b/gcc/testsuite/g++.dg/DRs/dr2580.C new file mode 100644 index 000000000000..462f3008b908 --- /dev/null +++ b/gcc/testsuite/g++.dg/DRs/dr2580.C @@ -0,0 +1,87 @@ +// DR 2580 - Undefined behavior with #line +// { dg-do preprocess } + +#line 630 "foobar.h" +#line 6 "dr2580.C" +#line 0 // { dg-error "line number out of range" } +#line 8 +#line 2147483648 // { dg-error "line number out of range" } +#line 10 +#line 4294967295 // { dg-error "line number out of range" } +#line 12 +#line 12345678912345 // { dg-error "line number out of range" } +#line 14 +#line 15 "" +#line 16 "foobar.h" +#line 17 "/a/b/c/baz.h" +#line 18 "dr2580.C" +#line 0 "dr2580.C" // { dg-error "line number out of range" } +#line 20 +#line 2147483648 "dr2580.C" // { dg-error "line number out of range" } +#line 22 +#line 4294967295 "dr2580.C" // { dg-error "line number out of range" } +#line 24 +#line 12345678912345 "dr2580.C" // { dg-error "line number out of range" } +#line 26 +#line 27 1 // { dg-error "'1' is not a valid filename" } +#line 28 +#line 29 foo bar baz // { dg-error "'foo' is not a valid filename" } +#line 30 +#line 31 "dr2580.C" 1 // { dg-error "extra tokens at end of '#line' directive" } +#line 32 +#line 33 "dr2580.C" foo bar baz // { dg-error "extra tokens at end of '#line' directive" } +#define A 35 +#line A +#define B 0 +#line B // { dg-error "line number out of range" } +#line 38 +#define C 2147483648 +#line C // { dg-error "line number out of range" } +#line 41 +#define D 4294967295 +#line D // { dg-error "line number out of range" } +#line 44 +#define E 12345678912345 +#line E // { dg-error "line number out of range" } +#line 47 +#define F 49 "dr2580.C" +#line F +#define G 0 "dr2580.C" +#line G // { dg-error "line number out of range" } +#line 52 "dr2580.C" +#define H 2147483647 "dr2580.C" +#line H // { dg-error "line number out of range" "" { target c++98_only } } +#line 55 +#define I 2147483648 "dr2580.C" +#line I // { dg-error "line number out of range" } +#line 58 +#define J 4294967295 "dr2580.C" +#line J // { dg-error "line number out of range" } +#line 61 +#define K 12345678912345 "dr2580.C" +#line K // { dg-error "line number out of range" } +#line 64 +#define M 7 0 +#line M // { dg-error "'0' is not a valid filename" } +#line 67 +#define N 90 foo bar baz +#line N // { dg-error "'foo' is not a valid filename" } +#line 70 +#define O 75 "dr2580.C" 2 +#line O // { dg-error "extra tokens at end of '#line' directive" } +#line 73 +#define P 90 "dr2580.C" foo bar baz +#line P // { dg-error "extra tokens at end of '#line' directive" } +#line 76 +#line -5 // { dg-error "'-' after '#line' is not a positive integer" } +#line 78 +#line -7 "dr2580.C" // { dg-error "'-' after '#line' is not a positive integer" } +#line 80 +#line 32767 +#line 82 +#line 32768 // { dg-error "line number out of range" "" { target c++98_only } } +#line 84 +#line 32767 "dr2580.C" +#line 86 +#line 32768 "dr2580.C" // { dg-error "line number out of range" "" { target c++98_only } } +#line 88