Skip to content

Commit 654722b

Browse files
committed
AST: Fix PackTypeParameterCollector for PackElementType
1 parent c20532e commit 654722b

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

lib/AST/ParameterPack.cpp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,18 @@ namespace {
3131
/// skipping those captured by nested pack expansion types.
3232
struct PackTypeParameterCollector: TypeWalker {
3333
llvm::SetVector<Type> typeParams;
34+
unsigned expansionLevel;
35+
SmallVector<unsigned, 2> elementLevel;
36+
37+
PackTypeParameterCollector() : expansionLevel(0) {
38+
elementLevel.push_back(0);
39+
}
3440

3541
Action walkToTypePre(Type t) override {
36-
if (t->is<PackExpansionType>())
37-
return Action::SkipChildren;
42+
if (t->is<PackExpansionType>()) {
43+
++expansionLevel;
44+
return Action::Continue;
45+
}
3846

3947
if (auto *boundGenericType = dyn_cast<BoundGenericType>(t.getPointer())) {
4048
if (auto parentType = boundGenericType->getParent())
@@ -58,15 +66,32 @@ struct PackTypeParameterCollector: TypeWalker {
5866
}
5967
}
6068

61-
if (auto *paramTy = t->getAs<GenericTypeParamType>()) {
62-
if (paramTy->isParameterPack())
63-
typeParams.insert(paramTy);
64-
} else if (auto *archetypeTy = t->getAs<PackArchetypeType>()) {
65-
typeParams.insert(archetypeTy->getRoot());
69+
if (auto *eltType = t->getAs<PackElementType>()) {
70+
elementLevel.push_back(eltType->getLevel());
71+
return Action::Continue;
72+
}
73+
74+
if (elementLevel.back() == expansionLevel) {
75+
if (auto *paramTy = t->getAs<GenericTypeParamType>()) {
76+
if (paramTy->isParameterPack())
77+
typeParams.insert(paramTy);
78+
} else if (auto *archetypeTy = t->getAs<PackArchetypeType>()) {
79+
typeParams.insert(archetypeTy->getRoot());
80+
}
6681
}
6782

6883
return Action::Continue;
6984
}
85+
86+
Action walkToTypePost(Type t) override {
87+
if (t->is<PackExpansionType>())
88+
--expansionLevel;
89+
90+
if (t->is<PackElementType>())
91+
elementLevel.pop_back();
92+
93+
return Action::Continue;
94+
}
7095
};
7196

7297
}

0 commit comments

Comments
 (0)