diff options
| author | ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> | 2025-07-15 08:04:17 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-15 15:04:17 +0000 |
| commit | 73e9987c9fc86dd91c20267e9cd79efd2d33d1af (patch) | |
| tree | abb30bda486b65adf5a304f9ebbe85c0cd5a8a9a /tools/slang-generate/main.cpp | |
| parent | d964555d2ee83fac2ba357e4ec81e2a393a7b12f (diff) | |
Fix `slang-generate` segfault when parsing `$(()...)` (#7683)
* Fix `slang-generate` segfault when parsing `(...)`
Currently the following code causes a failure:
* `myFunc($((int)val))`
* This fails since we parse it as `int)val` due to trying to find a body with repeating `(`.
The primary issue here is that auto-format prefers `$((...))` over `$( (...))`, making this an annoying bug.
* only read first char with `(`
* format code
---------
Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Diffstat (limited to 'tools/slang-generate/main.cpp')
| -rw-r--r-- | tools/slang-generate/main.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/tools/slang-generate/main.cpp b/tools/slang-generate/main.cpp index 3cb733471..9039e8c58 100644 --- a/tools/slang-generate/main.cpp +++ b/tools/slang-generate/main.cpp @@ -204,12 +204,18 @@ enum kNodeReadFlag_AllowEscape = 1 << 0, }; +template<bool onlyReadFirstOpenChar> Node* readBody(Reader& reader, NodeReadFlags flags, char openChar, int openCount, char closeChar) { while (peek(reader) == openChar) { get(reader); openCount++; + + // This case allows parsing `myFunc($((int)val))` correctly, else we parse + // body as `int)val`, causing non obvious segfault. + if constexpr (onlyReadFirstOpenChar) + break; } Node* nodes = nullptr; @@ -317,7 +323,7 @@ Node* readBody(Reader& reader, NodeReadFlags flags, char openChar, int openCount // addTextSpan(link, spanBegin, spanEnd); - Node* body = readBody(reader, 0, '(', 0, ')'); + Node* body = readBody<true>(reader, 0, '(', 0, ')'); addSpliceSpan(link, body); @@ -331,7 +337,7 @@ Node* readBody(Reader& reader, NodeReadFlags flags, char openChar, int openCount addTextSpan(link, spanBegin, lineBegin); - Node* body = readBody(reader, 0, '{', 0, '}'); + Node* body = readBody<false>(reader, 0, '{', 0, '}'); addEscapeSpan(link, body); @@ -419,7 +425,7 @@ Node* readInput(char const* inputBegin, char const* inputEnd) reader.cursor = inputBegin; reader.end = inputEnd; - return readBody(reader, kNodeReadFlag_AllowEscape, -2, 0, -2); + return readBody<false>(reader, kNodeReadFlag_AllowEscape, -2, 0, -2); } void emitRaw(FILE* stream, char const* begin, char const* end) |
