On 8/1/25 8:30 AM, Jakub Jelinek wrote:
Hi!
Contrary to what the paper says, I think for #line directives we diagnose
everything we should (sure, some diagnostics are pedwarns).
Tested on x86_64-linux, ok for trunk?
OK.
2025-08-01 Jakub Jelinek <ja...@redhat.com>
PR preprocessor/120778
* g++.dg/DRs/dr2580.C: New test.
--- gcc/testsuite/g++.dg/DRs/dr2580.C.jj 2025-08-01 14:18:26.215389197
+0200
+++ gcc/testsuite/g++.dg/DRs/dr2580.C 2025-08-01 14:26:33.162975454 +0200
@@ -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
Jakub