You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Speed up type literal lexing and make it more strict. (#4430)
This rejects type literals with more digits than we can lex without
APInt's help, and using a custom diagnostic. This is a pretty arbitrary
implementation limit, I'm wide open to even more strict rules here.
Despite no special casing and a very simplistic approach, by not using
APInt this completely eliminates the lexing overhead for `i32` in the
generated compilation benchmark where that specific type literal is very
common. We see a 10% improvement in lexing there:
```
BM_CompileAPIFileDenseDecls<Phase::Lex>/256 39.0µs ± 4% 34.8µs ± 2% -10.86% (p=0.000 n=19+20)
BM_CompileAPIFileDenseDecls<Phase::Lex>/1024 180µs ± 1% 158µs ± 2% -12.22% (p=0.000 n=18+20)
BM_CompileAPIFileDenseDecls<Phase::Lex>/4096 731µs ± 2% 641µs ± 1% -12.31% (p=0.000 n=18+20)
BM_CompileAPIFileDenseDecls<Phase::Lex>/16384 3.20ms ± 2% 2.86ms ± 2% -10.47% (p=0.000 n=18+19)
BM_CompileAPIFileDenseDecls<Phase::Lex>/65536 13.8ms ± 1% 12.4ms ± 2% -9.78% (p=0.000 n=18+19)
BM_CompileAPIFileDenseDecls<Phase::Lex>/262144 64.0ms ± 2% 58.4ms ± 2% -8.70% (p=0.000 n=19+18)
```
This starts to fix a TODO in the diagnostic for these by giving a
reasonably good diagnostic about a very large type literal. However, in
practice it regresses the diagnostics because error tokens produce noisy
extraneous diagnostics from parse and check currently. Leaving the TODO
there, and I have a follow-up PR to start improving the extraneous
diagnostics.
// CHECK:STDERR: fail_iN_bad_width.carbon:[[@LINE+4]]:33: error: integer literal with value 10000000000000000000 does not fit in i32 [IntLiteralTooLargeForI32]
// CHECK:STDERR: var test_i10000000000000000000: i10000000000000000000;
48
+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~
49
+
// CHECK:STDERR:
50
+
// CHECK:STDERR: fail_iN_bad_width.carbon:[[@LINE+4]]:34: error: found a type literal with a bit width using 20 digits, which is greater than the limit of 18 [TooManyTypeBitWidthDigits]
51
+
// CHECK:STDERR: var test_i10000000000000000000: i10000000000000000000;
52
+
// CHECK:STDERR: ^
53
+
// CHECK:STDERR:
46
54
var test_i10000000000000000000: i10000000000000000000;
47
55
48
56
// --- uN.carbon
@@ -76,10 +84,18 @@ var test_u15: u15;
76
84
// CHECK:STDERR:
77
85
var test_u1000000000: u1000000000;
78
86
// TODO: This diagnostic is not very good.
79
-
// CHECK:STDERR: fail_uN_bad_width.carbon:[[@LINE+4]]:33: error: integer literal with value 10000000000000000000 does not fit in i32 [IntLiteralTooLargeForI32]
// CHECK:STDERR: var test_u10000000000000000000: u10000000000000000000;
81
93
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~
82
94
// CHECK:STDERR:
95
+
// CHECK:STDERR: fail_uN_bad_width.carbon:[[@LINE+4]]:34: error: found a type literal with a bit width using 20 digits, which is greater than the limit of 18 [TooManyTypeBitWidthDigits]
96
+
// CHECK:STDERR: var test_u10000000000000000000: u10000000000000000000;
97
+
// CHECK:STDERR: ^
98
+
// CHECK:STDERR:
83
99
var test_u10000000000000000000: u10000000000000000000;
0 commit comments