Skip to content

Commit 7a0cd5a

Browse files
committed
ASTDemangler: Correctly demangle generic signature of nominal type in constrained extension
1 parent de94a46 commit 7a0cd5a

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

lib/AST/ASTDemangler.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,12 +1011,8 @@ LayoutConstraint ASTBuilder::getLayoutConstraintWithSizeAlign(
10111011
CanGenericSignature ASTBuilder::demangleGenericSignature(
10121012
NominalTypeDecl *nominalDecl,
10131013
NodePointer node) {
1014-
// The type parameters appearing in the signature's requirements are not
1015-
// notionally part of our current generic signature.
1016-
//
1017-
// FIXME: Fix this to support variadic generics.
10181014
llvm::SaveAndRestore<GenericSignature> savedSignature(
1019-
GenericSig, GenericSignature());
1015+
GenericSig, nominalDecl->getGenericSignature());
10201016

10211017
SmallVector<Requirement, 2> requirements;
10221018

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// RUN: %empty-directory(%t)
2+
3+
// RUN: %target-build-swift -emit-executable %s -g -o %t/variadic_nominal_types -emit-module -enable-experimental-feature VariadicGenerics
4+
5+
// RUN: sed -ne '/\/\/ *DEMANGLE-TYPE: /s/\/\/ *DEMANGLE-TYPE: *//p' < %s > %t/input
6+
// RUN: %lldb-moduleimport-test-with-sdk %t/variadic_nominal_types -type-from-mangled=%t/input | %FileCheck %s --check-prefix=CHECK-TYPE
7+
8+
// Because of -enable-experimental-feature VariadicGenerics
9+
// REQUIRES: asserts
10+
11+
struct Variadic<T..., U> {
12+
struct Inner<V..., W> {}
13+
}
14+
15+
extension Variadic where each T: Equatable {
16+
struct Constrained {}
17+
}
18+
19+
func blackHole(_: Any...) {}
20+
21+
do {
22+
let x0 = Variadic<Float>()
23+
let x1 = Variadic<Int, Float>()
24+
let x2 = Variadic<Int, String, Float>()
25+
let x3 = Variadic<Int, String, Float>.Inner<Character, Bool, Double>()
26+
27+
blackHole(x0, x1, x2, x3)
28+
}
29+
30+
do {
31+
let x0 = Variadic<Float>.Constrained()
32+
let x1 = Variadic<Int, Float>.Constrained()
33+
let x2 = Variadic<Int, String, Float>.Constrained()
34+
35+
blackHole(x0, x1, x2)
36+
}
37+
38+
// DEMANGLE-TYPE: $s22variadic_nominal_types8VariadicVyyQPSfGD
39+
// CHECK-TYPE: Variadic<Float>
40+
41+
// DEMANGLE-TYPE: $s22variadic_nominal_types8VariadicVySi_QPSfGD
42+
// CHECK-TYPE: Variadic<Int, Float>
43+
44+
// DEMANGLE-TYPE: $s22variadic_nominal_types8VariadicVySi_SSQPSfGD
45+
// CHECK-TYPE: Variadic<Int, String, Float>
46+
47+
// DEMANGLE-TYPE: $s22variadic_nominal_types8VariadicV5InnerVySi_SSQPSf_SJ_SbQPSdGD
48+
// CHECK-TYPE: Variadic<Int, String, Float>.Inner<Character, Bool, Double>
49+
50+
// DEMANGLE-TYPE: $s22variadic_nominal_types8VariadicVAASQRzrlE11ConstrainedVyyQPSf_GD
51+
// CHECK-TYPE: Variadic<Float>.Constrained
52+
53+
// DEMANGLE-TYPE: $s22variadic_nominal_types8VariadicVAASQRzrlE11ConstrainedVySi_QPSf_GD
54+
// CHECK-TYPE: Variadic<Int, Float>.Constrained
55+
56+
// DEMANGLE-TYPE: $s22variadic_nominal_types8VariadicVAASQRzrlE11ConstrainedVySi_SSQPSf_GD
57+
// CHECK-TYPE: Variadic<Int, String, Float>.Constrained

0 commit comments

Comments
 (0)