Initial support for generic parameters that are introduced in a function parameter list (#1247)

In order for this to work, we need to always use the argument deduction code path for function calls, instead of only using it when there is a `[...]` list, which means that argument deduction now needs to support implicit conversion.

Co-authored-by: Jon Meow <jperkins@google.com>
This commit is contained in:
Richard Smith
2022-05-12 08:48:19 -07:00
committed by GitHub
co-authored by Jon Meow
parent b27aa21a88
commit c29f56e667
14 changed files with 320 additions and 177 deletions
+16 -23
View File
@@ -93,40 +93,33 @@ void Pattern::PrintID(llvm::raw_ostream& out) const {
}
}
// Equivalent to `GetBindings`, but stores its output in `bindings` instead of
// returning it.
static void GetBindingsImpl(
const Pattern& pattern,
std::vector<Nonnull<const BindingPattern*>>& bindings) {
auto VisitNestedPatterns(const Pattern& pattern,
llvm::function_ref<bool(const Pattern&)> visitor)
-> bool {
if (!visitor(pattern)) {
return false;
}
switch (pattern.kind()) {
case PatternKind::BindingPattern:
bindings.push_back(&cast<BindingPattern>(pattern));
return;
case PatternKind::TuplePattern:
for (const Pattern* field : cast<TuplePattern>(pattern).fields()) {
GetBindingsImpl(*field, bindings);
if (!VisitNestedPatterns(*field, visitor)) {
return false;
}
}
return;
return true;
case PatternKind::AlternativePattern:
GetBindingsImpl(cast<AlternativePattern>(pattern).arguments(), bindings);
return;
return VisitNestedPatterns(cast<AlternativePattern>(pattern).arguments(),
visitor);
case PatternKind::VarPattern:
return VisitNestedPatterns(cast<VarPattern>(pattern).pattern(), visitor);
case PatternKind::BindingPattern:
case PatternKind::AutoPattern:
case PatternKind::ExpressionPattern:
case PatternKind::GenericBinding:
return;
case PatternKind::VarPattern:
GetBindingsImpl(cast<VarPattern>(pattern).pattern(), bindings);
return;
return true;
}
}
auto GetBindings(const Pattern& pattern)
-> std::vector<Nonnull<const BindingPattern*>> {
std::vector<Nonnull<const BindingPattern*>> result;
GetBindingsImpl(pattern, result);
return result;
}
auto PatternFromParenContents(Nonnull<Arena*> arena, SourceLocation source_loc,
const ParenContents<Pattern>& paren_contents)
-> Nonnull<Pattern*> {