summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2025-07-15 08:04:17 -0700
committerGitHub <noreply@github.com>2025-07-15 15:04:17 +0000
commit73e9987c9fc86dd91c20267e9cd79efd2d33d1af (patch)
treeabb30bda486b65adf5a304f9ebbe85c0cd5a8a9a /tools
parentd964555d2ee83fac2ba357e4ec81e2a393a7b12f (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')
-rw-r--r--tools/slang-generate/main.cpp12
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)