Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion compiler/noirc_frontend/src/elaborator/enums.rs
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,8 @@ impl Elaborator<'_> {
variables_defined: &mut Vec<Ident>,
) -> Pattern {
let location = constructor.typ.location;
let typ = self.resolve_type(constructor.typ);
let wildcard_allowed = true;
let typ = self.resolve_type(constructor.typ, wildcard_allowed);

let Some((struct_name, mut expected_field_types)) =
self.struct_name_and_field_types(&typ, location)
Expand Down
17 changes: 12 additions & 5 deletions compiler/noirc_frontend/src/elaborator/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,9 @@ impl Elaborator<'_> {
},
);

let length = self.convert_expression_type(length, &Kind::u32(), location);
let wildcard_allowed = true;
let length =
self.convert_expression_type(length, &Kind::u32(), location, wildcard_allowed);
let (repeated_element, elem_type) = self.elaborate_expression(*repeated_element);

let length_clone = length.clone();
Expand Down Expand Up @@ -616,7 +618,9 @@ impl Elaborator<'_> {
let generics = generics.map(|generics| {
vecmap(generics, |generic| {
let location = generic.location;
let typ = self.use_type_with_kind(generic, &Kind::Any);
let wildcard_allowed = true;
let typ =
self.use_type_with_kind(generic, &Kind::Any, wildcard_allowed);
Located::from(location, typ)
})
});
Expand Down Expand Up @@ -1042,7 +1046,8 @@ impl Elaborator<'_> {
location: Location,
) -> (HirExpression, Type) {
let (lhs, lhs_type) = self.elaborate_expression(cast.lhs);
let r#type = self.resolve_type(cast.r#type);
let wildcard_allowed = false;
let r#type = self.resolve_type(cast.r#type, wildcard_allowed);
let result = self.check_cast(&lhs, &lhs_type, &r#type, location);
let expr = HirExpression::Cast(HirCastExpression { lhs, r#type });
(expr, result)
Expand Down Expand Up @@ -1278,7 +1283,8 @@ impl Elaborator<'_> {
self.interner.next_type_variable_with_kind(Kind::Any)
}
} else {
self.resolve_type(typ)
let wildcard_allowed = false;
self.resolve_type(typ, wildcard_allowed)
};

arg_types.push(typ.clone());
Expand Down Expand Up @@ -1463,7 +1469,8 @@ impl Elaborator<'_> {
},
};

let typ = self.use_type(constraint.typ.clone());
let wildcard_allowed = true;
let typ = self.use_type(constraint.typ.clone(), wildcard_allowed);
let Some(trait_bound) = self.use_trait_bound(&constraint.trait_bound) else {
// resolve_trait_bound only returns None if it has already issued an error, so don't
// issue another here.
Expand Down
52 changes: 38 additions & 14 deletions compiler/noirc_frontend/src/elaborator/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -679,13 +679,15 @@ impl<'context> Elaborator<'context> {
pub(super) fn resolve_generic_kind(&mut self, generic: &UnresolvedGeneric) -> Kind {
if let UnresolvedGeneric::Numeric { ident, typ } = generic {
let unresolved_typ = typ.clone();
let wildcard_allowed = false;
let typ = if unresolved_typ.is_type_expression() {
self.resolve_type_with_kind(
unresolved_typ.clone(),
&Kind::numeric(Type::default_int_type()),
wildcard_allowed,
)
} else {
self.resolve_type(unresolved_typ.clone())
self.resolve_type(unresolved_typ.clone(), wildcard_allowed)
};
if !matches!(typ, Type::FieldElement | Type::Integer(_, _)) {
let unsupported_typ_err =
Expand Down Expand Up @@ -859,7 +861,8 @@ impl<'context> Elaborator<'context> {
&mut self,
constraint: &UnresolvedTraitConstraint,
) -> Option<TraitConstraint> {
let typ = self.resolve_type(constraint.typ.clone());
let wildcard_allowed = true;
let typ = self.resolve_type(constraint.typ.clone(), wildcard_allowed);
let trait_bound = self.resolve_trait_bound(&constraint.trait_bound)?;
let location = constraint.trait_bound.trait_path.location;

Expand All @@ -885,9 +888,15 @@ impl<'context> Elaborator<'context> {
let the_trait = self.lookup_trait_or_error(trait_path)?;
let trait_id = the_trait.id;
let location = bound.trait_path.location;
let wildcard_allowed = true;

let (ordered, named) =
self.resolve_type_args_inner(bound.trait_generics.clone(), trait_id, location, mode);
let (ordered, named) = self.resolve_type_args_inner(
bound.trait_generics.clone(),
trait_id,
location,
mode,
wildcard_allowed,
);

let trait_generics = TraitGenerics { ordered, named };
Some(ResolvedTraitBound { trait_id, trait_generics, location })
Expand Down Expand Up @@ -966,6 +975,7 @@ impl<'context> Elaborator<'context> {
let mut parameters = Vec::new();
let mut parameter_types = Vec::new();
let mut parameter_idents = Vec::new();
let wildcard_allowed = false;

for Param { visibility, pattern, typ, location: _ } in func.parameters().iter().cloned() {
self.run_lint(|_| {
Expand All @@ -978,7 +988,7 @@ impl<'context> Elaborator<'context> {
self.desugar_impl_trait_arg(path, args, &mut generics, &mut trait_constraints)
}
// Function parameters have Kind::Normal
_ => self.resolve_type_with_kind(typ, &Kind::Normal),
_ => self.resolve_type_with_kind(typ, &Kind::Normal, wildcard_allowed),
};

self.check_if_type_is_valid_for_program_input(
Expand All @@ -1004,7 +1014,7 @@ impl<'context> Elaborator<'context> {
parameter_types.push(typ);
}

let return_type = Box::new(self.use_type(func.return_type()));
let return_type = Box::new(self.use_type(func.return_type(), wildcard_allowed));

let mut typ = Type::Function(
parameter_types,
Expand Down Expand Up @@ -1538,8 +1548,12 @@ impl<'context> Elaborator<'context> {
// This can't be done in code, but it could happen with unquoted types.
continue;
};
let resolved_type =
self.resolve_type_with_kind(unresolved_type, &associated_type.typ.kind());
let wildcard_allowed = false;
let resolved_type = self.resolve_type_with_kind(
unresolved_type,
&associated_type.typ.kind(),
wildcard_allowed,
);
named_generic.type_var.bind(resolved_type);
}
}
Expand Down Expand Up @@ -1756,7 +1770,8 @@ impl<'context> Elaborator<'context> {

let generics = self.add_generics(&alias.type_alias_def.generics);
self.current_item = Some(DependencyId::Alias(alias_id));
let typ = self.use_type(alias.type_alias_def.typ);
let wildcard_allowed = false;
let typ = self.use_type(alias.type_alias_def.typ, wildcard_allowed);

if visibility != ItemVisibility::Private {
self.check_type_is_not_more_private_then_item(name, visibility, &typ, location);
Expand Down Expand Up @@ -1966,11 +1981,16 @@ impl<'context> Elaborator<'context> {
let struct_def = this.interner.get_type(struct_id);
this.add_existing_generics(&unresolved.generics, &struct_def.borrow().generics);

let wildcard_allowed = false;
let fields = vecmap(&unresolved.fields, |field| {
let ident = &field.item.name;
let typ = &field.item.typ;
let visibility = field.item.visibility;
StructField { visibility, name: ident.clone(), typ: this.resolve_type(typ.clone()) }
StructField {
visibility,
name: ident.clone(),
typ: this.resolve_type(typ.clone(), wildcard_allowed),
}
});

this.resolving_ids.remove(&struct_id);
Expand Down Expand Up @@ -2001,10 +2021,12 @@ impl<'context> Elaborator<'context> {
datatype.borrow_mut().init_variants();
self.resolving_ids.insert(*type_id);

let wildcard_allowed = false;
for (i, variant) in typ.enum_def.variants.iter().enumerate() {
let parameters = variant.item.parameters.as_ref();
let types =
parameters.map(|params| vecmap(params, |typ| self.resolve_type(typ.clone())));
let types = parameters.map(|params| {
vecmap(params, |typ| self.resolve_type(typ.clone(), wildcard_allowed))
});
let name = variant.item.name.clone();

let is_function = types.is_some();
Expand Down Expand Up @@ -2128,7 +2150,8 @@ impl<'context> Elaborator<'context> {

for (generics, _, function_set) in function_sets {
self.add_generics(generics);
let self_type = self.resolve_type(self_type.clone());
let wildcard_allowed = false;
let self_type = self.resolve_type(self_type.clone(), wildcard_allowed);

function_set.self_type = Some(self_type.clone());
self.self_type = Some(self_type);
Expand Down Expand Up @@ -2287,7 +2310,8 @@ impl<'context> Elaborator<'context> {
.chain(new_generics_trait_constraints.iter().map(|(constraint, _)| constraint)),
);

let self_type = self.resolve_type(unresolved_type);
let wildcard_allowed = false;
let self_type = self.resolve_type(unresolved_type, wildcard_allowed);
self.self_type = Some(self_type.clone());
trait_impl.methods.self_type = Some(self_type);

Expand Down
6 changes: 4 additions & 2 deletions compiler/noirc_frontend/src/elaborator/patterns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -725,7 +725,8 @@ impl Elaborator<'_> {
let generics = segment.generics.map(|generics| {
vecmap(generics, |generic| {
let location = generic.location;
let typ = self.use_type_with_kind(generic, &Kind::Any);
let wildcard_allowed = true;
let typ = self.use_type_with_kind(generic, &Kind::Any, wildcard_allowed);
Located::from(location, typ)
})
});
Expand Down Expand Up @@ -1142,7 +1143,8 @@ impl Elaborator<'_> {
pub(super) fn elaborate_type_path(&mut self, path: TypePath) -> (ExprId, Type) {
let typ_location = path.typ.location;
let turbofish = path.turbofish;
let typ = self.use_type(path.typ);
let wildcard_allowed = true;
let typ = self.use_type(path.typ, wildcard_allowed);
self.elaborate_type_path_impl(typ, path.item, turbofish, typ_location)
}

Expand Down
3 changes: 3 additions & 0 deletions compiler/noirc_frontend/src/elaborator/primitive_types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ impl Elaborator<'_> {
primitive_type: PrimitiveType,
args: GenericTypeArgs,
location: Location,
wildcard_allowed: bool,
) -> Type {
match primitive_type {
PrimitiveType::Bool
Expand Down Expand Up @@ -231,6 +232,7 @@ impl Elaborator<'_> {
item,
location,
PathResolutionMode::MarkAsReferenced,
wildcard_allowed,
);
assert_eq!(args.len(), 1);
let length = args.pop().unwrap();
Expand All @@ -243,6 +245,7 @@ impl Elaborator<'_> {
item,
location,
PathResolutionMode::MarkAsReferenced,
wildcard_allowed,
);
assert_eq!(args.len(), 2);
let element = args.pop().unwrap();
Expand Down
3 changes: 2 additions & 1 deletion compiler/noirc_frontend/src/elaborator/trait_impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,8 @@ impl Elaborator<'_> {
) -> Vec<(Ident, UnresolvedType, Kind)> {
let mut associated_types = Vec::new();
for (name, typ, expr) in trait_impl.associated_constants.drain(..) {
let resolved_type = self.resolve_type(typ);
let wildcard_allowed = false;
let resolved_type = self.resolve_type(typ, wildcard_allowed);
let kind = Kind::Numeric(Box::new(resolved_type));
let location = expr.location;
let typ = match UnresolvedTypeExpression::from_expr(expr, location) {
Expand Down
Loading
Loading