mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
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:
committed by
GitHub
co-authored by
Jon Meow
parent
b27aa21a88
commit
c29f56e667
+16
-23
@@ -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*> {
|
||||
|
||||
Reference in New Issue
Block a user