Skip to content

Commit

Permalink
chore: pull across noir-lang/noir#6558 (#10037)
Browse files Browse the repository at this point in the history
This pulls across noir-lang/noir#6558 from the
main noir repo which addresses the issue with compiling bloblib
noir-lang/noir#6457.

cc @MirandaWood @iAmMichaelConnor
  • Loading branch information
TomAFrench authored Nov 19, 2024
1 parent 95a12b7 commit 3014a69
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 4 deletions.
22 changes: 20 additions & 2 deletions noir/noir-repo/compiler/noirc_frontend/src/hir_def/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1655,12 +1655,15 @@ impl Type {
) -> Result<(), UnificationError> {
use Type::*;

let lhs = match self {
let lhs = self.follow_bindings_shallow();
let rhs = other.follow_bindings_shallow();

let lhs = match lhs.as_ref() {
Type::InfixExpr(..) => Cow::Owned(self.canonicalize()),
other => Cow::Borrowed(other),
};

let rhs = match other {
let rhs = match rhs.as_ref() {
Type::InfixExpr(..) => Cow::Owned(other.canonicalize()),
other => Cow::Borrowed(other),
};
Expand Down Expand Up @@ -2494,6 +2497,21 @@ impl Type {
}
}

/// Follow bindings if this is a type variable or generic to the first non-typevariable
/// type. Unlike `follow_bindings`, this won't recursively follow any bindings on any
/// fields or arguments of this type.
pub fn follow_bindings_shallow(&self) -> Cow<Type> {
match self {
Type::TypeVariable(var) | Type::NamedGeneric(var, _) => {
if let TypeBinding::Bound(typ) = &*var.borrow() {
return Cow::Owned(typ.follow_bindings_shallow().into_owned());
}
Cow::Borrowed(self)
}
other => Cow::Borrowed(other),
}
}

pub fn from_generics(generics: &GenericTypeVars) -> Vec<Type> {
vecmap(generics, |var| Type::TypeVariable(var.clone()))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -953,7 +953,8 @@ impl<'interner> Monomorphizer<'interner> {

/// Convert a non-tuple/struct type to a monomorphized type
fn convert_type(typ: &HirType, location: Location) -> Result<ast::Type, MonomorphizationError> {
Ok(match typ {
let typ = typ.follow_bindings_shallow();
Ok(match typ.as_ref() {
HirType::FieldElement => ast::Type::Field,
HirType::Integer(sign, bits) => ast::Type::Integer(*sign, *bits),
HirType::Bool => ast::Type::Bool,
Expand Down Expand Up @@ -1119,7 +1120,8 @@ impl<'interner> Monomorphizer<'interner> {

// Similar to `convert_type` but returns an error if any type variable can't be defaulted.
fn check_type(typ: &HirType, location: Location) -> Result<(), MonomorphizationError> {
match typ {
let typ = typ.follow_bindings_shallow();
match typ.as_ref() {
HirType::FieldElement
| HirType::Integer(..)
| HirType::Bool
Expand Down

0 comments on commit 3014a69

Please sign in to comment.