]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Add #line testcase for CWG2580 [PR120778]
authorJakub Jelinek <jakub@redhat.com>
Mon, 4 Aug 2025 13:28:29 +0000 (15:28 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 4 Aug 2025 13:28:29 +0000 (15:28 +0200)
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  <jakub@redhat.com>

PR preprocessor/120778
* g++.dg/DRs/dr2580.C: New test.

gcc/testsuite/g++.dg/DRs/dr2580.C [new file with mode: 0644]

diff --git a/gcc/testsuite/g++.dg/DRs/dr2580.C b/gcc/testsuite/g++.dg/DRs/dr2580.C
new file mode 100644 (file)
index 0000000..462f300
--- /dev/null
@@ -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