diff --git a/Sources/TestingMacros/ConditionMacro.swift b/Sources/TestingMacros/ConditionMacro.swift index 3d2013c69..a077ab5bf 100644 --- a/Sources/TestingMacros/ConditionMacro.swift +++ b/Sources/TestingMacros/ConditionMacro.swift @@ -324,7 +324,24 @@ public struct NonOptionalRequireMacro: RefinedConditionMacro { in context: some MacroExpansionContext ) throws -> ExprSyntax { if let argument = macro.arguments.first { +#if !SWT_FIXED_137943258 + // Silence this warning if we see a token (`?`, `nil`, or "Optional") that + // might indicate the test author expects the expression is optional. + let tokenKindsIndicatingOptionality: [TokenKind] = [ + .infixQuestionMark, + .postfixQuestionMark, + .keyword(.nil), + .identifier("Optional") + ] + let looksOptional = argument.tokens(viewMode: .sourceAccurate).lazy + .map(\.tokenKind) + .contains(where: tokenKindsIndicatingOptionality.contains) + if !looksOptional { + context.diagnose(.nonOptionalRequireIsRedundant(argument.expression, in: macro)) + } +#else context.diagnose(.nonOptionalRequireIsRedundant(argument.expression, in: macro)) +#endif } // Perform the normal macro expansion for #require(). diff --git a/Tests/TestingMacrosTests/ConditionMacroTests.swift b/Tests/TestingMacrosTests/ConditionMacroTests.swift index 9f1201367..e7307476d 100644 --- a/Tests/TestingMacrosTests/ConditionMacroTests.swift +++ b/Tests/TestingMacrosTests/ConditionMacroTests.swift @@ -352,6 +352,22 @@ struct ConditionMacroTests { #expect(diagnostic.message.contains("is redundant")) } +#if !SWT_FIXED_137943258 + @Test( + "#require(optional value mistyped as non-optional) diagnostic is suppressed", + .bug("https://github.com/swiftlang/swift/issues/79202"), + arguments: [ + "#requireNonOptional(expression as? T)", + "#requireNonOptional(expression as Optional)", + "#requireNonOptional(expression ?? nil)", + ] + ) + func requireNonOptionalDiagnosticSuppressed(input: String) throws { + let (_, diagnostics) = try parse(input) + #expect(diagnostics.isEmpty) + } +#endif + @Test("#require(throws: Never.self) produces a diagnostic", arguments: [ "#requireThrows(throws: Swift.Never.self)",