Skip to content

Commit 8790101

Browse files
authored
Merge pull request #63641 from sophiapoirier/rdar104716322_constraint_environment_assertion
pack expansion within a container type fails to type check with Const…
2 parents 22893a0 + 3d21807 commit 8790101

File tree

6 files changed

+32
-33
lines changed

6 files changed

+32
-33
lines changed

lib/Sema/TypeCheckType.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,8 @@ TypeResolution::forStructural(DeclContext *dc, TypeResolutionOptions options,
6666
OpenUnboundGenericTypeFn unboundTyOpener,
6767
HandlePlaceholderTypeReprFn placeholderHandler,
6868
OpenPackElementFn packElementOpener) {
69-
return TypeResolution(dc, TypeResolutionStage::Structural, options,
70-
unboundTyOpener, placeholderHandler,
71-
packElementOpener);
69+
return TypeResolution(dc, {}, TypeResolutionStage::Structural, options,
70+
unboundTyOpener, placeholderHandler, packElementOpener);
7271
}
7372

7473
TypeResolution
@@ -86,18 +85,18 @@ TypeResolution::forInterface(DeclContext *dc, GenericSignature genericSig,
8685
OpenUnboundGenericTypeFn unboundTyOpener,
8786
HandlePlaceholderTypeReprFn placeholderHandler,
8887
OpenPackElementFn packElementOpener) {
89-
TypeResolution result(dc, TypeResolutionStage::Interface, options,
90-
unboundTyOpener, placeholderHandler,
91-
packElementOpener);
92-
result.genericSig = genericSig;
93-
return result;
88+
return TypeResolution(dc, genericSig, TypeResolutionStage::Interface, options,
89+
unboundTyOpener, placeholderHandler, packElementOpener);
9490
}
9591

9692
TypeResolution TypeResolution::withOptions(TypeResolutionOptions opts) const {
97-
TypeResolution result(dc, stage, opts, unboundTyOpener, placeholderHandler,
98-
packElementOpener);
99-
result.genericSig = genericSig;
100-
return result;
93+
return TypeResolution(dc, genericSig, stage, opts, unboundTyOpener,
94+
placeholderHandler, packElementOpener);
95+
}
96+
97+
TypeResolution TypeResolution::withoutPackElementOpener() const {
98+
return TypeResolution(dc, genericSig, stage, options, unboundTyOpener,
99+
placeholderHandler, {});
101100
}
102101

103102
ASTContext &TypeResolution::getASTContext() const {
@@ -4548,7 +4547,11 @@ NeverNullType TypeResolver::resolvePackExpansionType(PackExpansionTypeRepr *repr
45484547

45494548
auto elementOptions = options;
45504549
elementOptions |= TypeResolutionFlags::AllowPackReferences;
4551-
auto patternType = resolveType(repr->getPatternType(), elementOptions);
4550+
4551+
auto elementResolution =
4552+
resolution.withoutPackElementOpener().withOptions(elementOptions);
4553+
auto patternType =
4554+
elementResolution.resolveType(repr->getPatternType(), silContext);
45524555
if (patternType->hasError())
45534556
return ErrorType::get(ctx);
45544557

@@ -4590,6 +4593,7 @@ NeverNullType TypeResolver::resolvePackElement(PackElementTypeRepr *repr,
45904593
TypeResolutionOptions options) {
45914594
auto &ctx = getASTContext();
45924595
options |= TypeResolutionFlags::FromPackReference;
4596+
45934597
auto packReference = resolveType(repr->getPackType(), options);
45944598

45954599
// If we already failed, don't diagnose again.

lib/Sema/TypeCheckType.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -510,19 +510,18 @@ class TypeResolution {
510510
OpenUnboundGenericTypeFn unboundTyOpener;
511511
HandlePlaceholderTypeReprFn placeholderHandler;
512512
OpenPackElementFn packElementOpener;
513-
514-
private:
515513
GenericSignature genericSig;
516514

517-
TypeResolution(DeclContext *dc, TypeResolutionStage stage,
518-
TypeResolutionOptions options,
515+
private:
516+
TypeResolution(DeclContext *dc, GenericSignature genericSig,
517+
TypeResolutionStage stage, TypeResolutionOptions options,
519518
OpenUnboundGenericTypeFn unboundTyOpener,
520519
HandlePlaceholderTypeReprFn placeholderHandler,
521520
OpenPackElementFn packElementOpener)
522521
: dc(dc), stage(stage), options(options),
523522
unboundTyOpener(unboundTyOpener),
524523
placeholderHandler(placeholderHandler),
525-
packElementOpener(packElementOpener) {}
524+
packElementOpener(packElementOpener), genericSig(genericSig) {}
526525

527526
public:
528527
/// Form a type resolution for the structure of a type, which does not
@@ -572,6 +571,8 @@ class TypeResolution {
572571
public:
573572
TypeResolution withOptions(TypeResolutionOptions opts) const;
574573

574+
TypeResolution withoutPackElementOpener() const;
575+
575576
public:
576577
/// Retrieve the ASTContext in which this resolution occurs.
577578
ASTContext &getASTContext() const;

test/Constraints/variadic_generic_types.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: rdar104716322
2-
31
// RUN: %target-typecheck-verify-swift -enable-experimental-feature VariadicGenerics
42

53
// REQUIRES: asserts
@@ -22,5 +20,7 @@ func g<T...>(_: repeat each T) {
2220
_ = ((repeat each T) -> ()).self
2321
_ = ((Int, repeat Array<each T>) -> ()).self
2422

25-
_ = (repeat each Int).self // expected-error {{variadic expansion 'Int' must contain at least one variadic generic parameter}}
23+
_ = (repeat each Int).self
24+
// expected-error@-1 {{variadic expansion 'Int' must contain at least one variadic generic parameter}}
25+
// expected-error@-2 {{'each' cannot be applied to non-pack type 'Int'}}
2626
}

test/IRGen/variadic_generic_types.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: rdar104716322
2-
31
// RUN: %target-swift-frontend -emit-ir -primary-file %s -enable-experimental-feature VariadicGenerics | %FileCheck %s
42

53
// Because of -enable-experimental-feature VariadicGenerics
@@ -8,12 +6,12 @@
86
// REQUIRES: PTRSIZE=64
97

108
struct G<T...> {
11-
// CHECK-LABEL: define hidden swiftcc void @"$s22variadic_generic_types1GV6calleeyyF"(i64 %0, %swift.type* %T)
9+
// CHECK-LABEL: define hidden swiftcc void @"$s22variadic_generic_types1GV6calleeyyF"(i64 %0, %swift.type** %T)
1210
// CHECK: ret void
1311
func callee() {}
1412

15-
// CHECK-LABEL: define hidden swiftcc void @"$s22variadic_generic_types1GV6calleryyF"(i64 %0, %swift.type* %T)
16-
// CHECK: call swiftcc void @"$s22variadic_generic_types1GV6calleeyyF"(i64 %0, %swift.type* %T)
13+
// CHECK-LABEL: define hidden swiftcc void @"$s22variadic_generic_types1GV6calleryyF"(i64 %0, %swift.type** %T)
14+
// CHECK: call swiftcc void @"$s22variadic_generic_types1GV6calleeyyF"(i64 %0, %swift.type** %T)
1715
// CHECK: ret void
1816
func caller() {
1917
callee()
@@ -24,7 +22,7 @@ struct G<T...> {
2422
}
2523

2624
func makeTuple2() -> (repeat Array<each T>).Type {
27-
return (repeat Array<T>).self
25+
return (repeat Array<each T>).self
2826
}
2927
}
3028

test/Interpreter/variadic_generic_types.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: rdar104716322
2-
31
// RUN: %target-run-simple-swift(-enable-experimental-feature VariadicGenerics) | %FileCheck %s
42

53
// REQUIRES: executable_test

test/SILGen/pack_expansion_type.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// REQUIRES: rdar104716322
2-
31
// RUN: %target-swift-emit-silgen %s -enable-experimental-feature VariadicGenerics | %FileCheck %s
42

53
// Experimental features require an asserts compiler
@@ -16,8 +14,8 @@ public struct VariadicType<T...> {
1614
// CHECK: bb0(%0 : $*Pack{repeat (each T, each U)}, %1 : $*Pack{repeat each T}, %2 : $*Pack{repeat each U}, %3 : $VariadicType<repeat each T>):
1715
public func variadicMethod<U...>(t: repeat each T, u: repeat each U) -> (repeat (each T, each U)) {}
1816

19-
// CHECK-LABEL: sil [ossa] @$s19pack_expansion_type12VariadicTypeV13takesFunction1tyqd__qd__Qp_txxQpXE_tlF : $@convention(method) <T...><U...> (@noescape @callee_guaranteed @substituted <τ_0_0..., τ_0_1..., τ_0_2..., τ_0_3...> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <T, T, U, U>, VariadicType<repeat each T>) -> () {
20-
// CHECK: bb0(%0 : $@noescape @callee_guaranteed @substituted <τ_0_0..., τ_0_1..., τ_0_2..., τ_0_3...> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <T, T, U, U>, %1 : $VariadicType<repeat each T>):
17+
// CHECK-LABEL: sil [ossa] @$s19pack_expansion_type12VariadicTypeV13takesFunction1tyqd__qd__Qp_txxQpXE_tlF : $@convention(method) <T...><U...> (@guaranteed @noescape @callee_guaranteed @substituted <τ_0_0..., τ_0_1..., τ_0_2..., τ_0_3...> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <T, T, U, U>, VariadicType<repeat each T>) -> () {
18+
// CHECK: bb0(%0 : @guaranteed $@noescape @callee_guaranteed @substituted <τ_0_0..., τ_0_1..., τ_0_2..., τ_0_3...> (@pack_guaranteed Pack{repeat each τ_0_0}) -> @pack_out Pack{repeat each τ_0_2} for <T, T, U, U>, %1 : $VariadicType<repeat each T>):
2119
public func takesFunction<U...>(t: (repeat each T) -> (repeat each U)) {}
2220
}
2321

0 commit comments

Comments
 (0)