From 7ec3789cf7ec3c35cb43d2d73c42f9f10f4bcbe8 Mon Sep 17 00:00:00 2001 From: Tony Allevato Date: Tue, 2 Dec 2025 15:59:54 -0500 Subject: [PATCH] [ASTDumper] Fix malformed JSON for `async let _ = ...`. By calling `printCommon` twice, this inserts a JSON object into another JSON object without a key. This asserts inside LLVM's JSON helper, but only if the compiler is built with assertions enabled (which Xcode's compiler doesn't). This also fixes the S-expression version, which is similarly busted: ``` (pattern_entry (async_let type="Int" (pattern_any type="Int") (original_init=call_expr type="Int" ... ``` --- lib/AST/ASTDumper.cpp | 4 +--- test/Frontend/ast-dump-json-no-crash.swift | 8 ++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/AST/ASTDumper.cpp b/lib/AST/ASTDumper.cpp index ba07c0334e3..699b754721f 100644 --- a/lib/AST/ASTDumper.cpp +++ b/lib/AST/ASTDumper.cpp @@ -1913,10 +1913,8 @@ namespace { printFoot(); } void visitAnyPattern(AnyPattern *P, Label label) { - if (P->isAsyncLet()) { - printCommon(P, "async_let ", label); - } printCommon(P, "pattern_any", label); + printFlag(P->isAsyncLet(), "async_let", DeclModifierColor); printFoot(); } void visitTypedPattern(TypedPattern *P, Label label) { diff --git a/test/Frontend/ast-dump-json-no-crash.swift b/test/Frontend/ast-dump-json-no-crash.swift index 8fbbf46a4d1..e4db14fdc36 100644 --- a/test/Frontend/ast-dump-json-no-crash.swift +++ b/test/Frontend/ast-dump-json-no-crash.swift @@ -503,3 +503,11 @@ func outerFn() { } innerFun(shouldRecurse: true) } + +// Regression test: Discarded async lets were calling `printCommon` twice, +// which resulted in invalid JSON (and not-so-great S-expression output) +// either. +func discardedAsyncLet() async { + func someTask() async {} + async let _ = someTask() +}