diff --git a/include/swift/AST/Types.h b/include/swift/AST/Types.h index 831625a612e1f..12ebe9f22d134 100644 --- a/include/swift/AST/Types.h +++ b/include/swift/AST/Types.h @@ -2459,6 +2459,10 @@ class TupleType final : public TypeBase, public llvm::FoldingSetNode, bool containsPackExpansionType() const; + /// Check whether this tuple consists of a single unlabeled element + /// of \c PackExpansionType. + bool isSingleUnlabeledPackExpansion() const; + private: TupleType(ArrayRef elements, const ASTContext *CanCtx, RecursiveTypeProperties properties) diff --git a/lib/AST/ParameterPack.cpp b/lib/AST/ParameterPack.cpp index 5da8dedbc23cc..2672a584afc73 100644 --- a/lib/AST/ParameterPack.cpp +++ b/lib/AST/ParameterPack.cpp @@ -134,6 +134,14 @@ bool CanTupleType::containsPackExpansionTypeImpl(CanTupleType tuple) { return false; } +bool TupleType::isSingleUnlabeledPackExpansion() const { + if (getNumElements() != 1) + return false; + + const auto &elt = getElement(0); + return !elt.hasName() && elt.getType()->is(); +} + bool AnyFunctionType::containsPackExpansionType(ArrayRef params) { for (auto param : params) { if (param.getPlainType()->is()) diff --git a/lib/Sema/TypeCheckStmt.cpp b/lib/Sema/TypeCheckStmt.cpp index 3ed3d16801a13..84b0fefbeedc1 100644 --- a/lib/Sema/TypeCheckStmt.cpp +++ b/lib/Sema/TypeCheckStmt.cpp @@ -1749,6 +1749,16 @@ Stmt *PreCheckReturnStmtRequest::evaluate(Evaluator &evaluator, ReturnStmt *RS, } static bool isDiscardableType(Type type) { + // If type is `(_: repeat ...)`, it can be discardable. + if (auto *tuple = type->getAs()) { + if (tuple->isSingleUnlabeledPackExpansion()) { + type = tuple->getElementType(0); + } + } + + if (auto *expansion = type->getAs()) + return isDiscardableType(expansion->getPatternType()); + return (type->hasError() || type->isUninhabited() || type->lookThroughAllOptionalTypes()->isVoid()); diff --git a/test/Constraints/pack-expansion-expressions.swift b/test/Constraints/pack-expansion-expressions.swift index 5a75e895fa403..06ac4df2d3dd4 100644 --- a/test/Constraints/pack-expansion-expressions.swift +++ b/test/Constraints/pack-expansion-expressions.swift @@ -397,3 +397,14 @@ do { _ = Defaulted(t: "b", 0) // Ok _ = Defaulted(t: "c", 1.0, u: "d", 0) // Ok } + +// rdar://108064941 - unused result diagnostic is unaware of Void packs +func test_no_unused_result_warning(arr: inout [Any]) { + func test1(_ value: (repeat each T)) { + repeat arr.append(each value.element) // no warning + } + + func test2(_ value: repeat each T) { + ((repeat arr.append(each value))) // no warning + } +}