From e3bc577510c52b3a223edd765ecb23c3ac8f12b1 Mon Sep 17 00:00:00 2001 From: Daniel Duan Date: Wed, 8 Jul 2026 22:42:57 -0700 Subject: [PATCH] Fix string accessor type mismatch --- Sources/TOMLDecoder/Parsing/Parser.swift | 3 +++ .../TOMLDecoderTests/TOMLTableKeyMembershipTests.swift | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/Sources/TOMLDecoder/Parsing/Parser.swift b/Sources/TOMLDecoder/Parsing/Parser.swift index dab1648d..33759731 100644 --- a/Sources/TOMLDecoder/Parsing/Parser.swift +++ b/Sources/TOMLDecoder/Parsing/Parser.swift @@ -1249,6 +1249,9 @@ extension Token { } let quoteChar = bytes[text.lowerBound] + if quoteChar != CodeUnits.doubleQuote, quoteChar != CodeUnits.singleQuote { + throw TOMLError(.typeMismatch(context: context, lineNumber: lineNumber, expected: "string")) + } var index = text.lowerBound var endIndex = text.upperBound diff --git a/Tests/TOMLDecoderTests/TOMLTableKeyMembershipTests.swift b/Tests/TOMLDecoderTests/TOMLTableKeyMembershipTests.swift index ee9484be..d6464b38 100644 --- a/Tests/TOMLDecoderTests/TOMLTableKeyMembershipTests.swift +++ b/Tests/TOMLDecoderTests/TOMLTableKeyMembershipTests.swift @@ -35,4 +35,14 @@ struct TOMLTableKeyMembershipTests { #expect(table.contains(key: "c")) #expect(!table.contains(key: "d")) } + + @Test + func stringAccessorMismatchInInlineTableThrowsWithoutTrapping() throws { + let table = try TOMLTable(source: "foo_bar = { x = 1 }\n") + let inlineTable = try table.table(forKey: "foo_bar") + + #expect(throws: TOMLError.self) { + try inlineTable.string(forKey: "x") + } + } }