Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
29a2b70
fix: the default type of a numeric generic is not the numeric generic…
asterite Mar 28, 2025
6b67594
Numeric generic arguments are values, not types
asterite Mar 28, 2025
6bad237
Constant without a default type is okay
asterite Mar 28, 2025
b4d5771
Fix inlay hint type of unbound numeric generic
asterite Mar 28, 2025
cd23b6e
clippy
asterite Mar 28, 2025
90995c5
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite Apr 2, 2025
975bc49
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite Apr 2, 2025
e58de81
Merge branch 'ab/better-error-message-when-cannot-infer-generic-numer…
asterite Apr 2, 2025
46f6165
.
asterite Apr 2, 2025
d2bae8a
Fixes
asterite Apr 2, 2025
205ea62
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite Apr 3, 2025
a8ca786
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite Apr 3, 2025
a07e9aa
Tests
asterite Apr 3, 2025
2e2234c
Bump Aztec-Packages commit
asterite Apr 3, 2025
447d04f
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite Apr 7, 2025
d5f4eb7
Fix after merge
asterite Apr 7, 2025
cc8f56c
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite Apr 25, 2025
3169c66
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 7, 2025
3dd92f9
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 13, 2025
dbc3906
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
TomAFrench May 13, 2025
1d87b89
Merge branch 'ab/better-error-message-when-cannot-infer-generic-numer…
asterite May 13, 2025
637052d
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
TomAFrench May 13, 2025
cd474c2
Merge branch 'ab/better-error-message-when-cannot-infer-generic-numer…
asterite May 13, 2025
7de3f27
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 13, 2025
8b6ec52
Bump Aztec-Packages commit
asterite May 13, 2025
aa8c26c
Remove duplicate function
asterite May 13, 2025
57f5497
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 14, 2025
acaa37d
Bump Aztec-Packages commit
asterite May 14, 2025
cde3c8b
Merge branch 'ab/better-error-message-when-cannot-infer-generic-numer…
asterite May 14, 2025
52d202b
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 14, 2025
cdc8679
Remove unused generic in test program
asterite May 14, 2025
f840998
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 19, 2025
67ec726
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 20, 2025
97272c2
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 21, 2025
f78e7c6
Merge branch 'master' into ab/better-error-message-when-cannot-infer-…
asterite May 21, 2025
5776ff1
A few libraries don't compile with this change
asterite May 21, 2025
bf0834e
Merge branch 'ab/better-error-message-when-cannot-infer-generic-numer…
asterite May 21, 2025
eb3381d
Revert "A few libraries don't compile with this change"
asterite May 21, 2025
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
8 changes: 7 additions & 1 deletion compiler/noirc_frontend/src/hir_def/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,13 @@ impl Kind {
match self {
Kind::IntegerOrField => Some(Type::default_int_or_field_type()),
Kind::Integer => Some(Type::default_int_type()),
Kind::Numeric(typ) => Some(*typ.clone()),
Kind::Numeric(_typ) => {
// Even though we have a type here, that type cannot be used as
// the default type of a numeric generic.
// For example, if we have `let N: u32` and we don't know
// what `N` is, we can't assume it's `u32`.
None
}
Kind::Any | Kind::Normal => None,
}
}
Expand Down
5 changes: 4 additions & 1 deletion compiler/noirc_frontend/src/monomorphization/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ pub enum MonomorphizationError {
generic_name: String,
item_kind: &'static str,
item_name: String,
is_numeric: bool,
},
InternalError {
message: &'static str,
Expand Down Expand Up @@ -96,10 +97,12 @@ impl From<MonomorphizationError> for CustomDiagnostic {
generic_name,
item_kind,
item_name,
is_numeric,
} => {
let message = "Type annotation needed".into();
let type_or_value = if *is_numeric { "value" } else { "type" };
let secondary = format!(
"Could not determine the type of the generic argument `{generic_name}` declared on the {item_kind} `{item_name}`"
"Could not determine the {type_or_value} of the generic argument `{generic_name}` declared on the {item_kind} `{item_name}`",
);
return CustomDiagnostic::simple_error(message, secondary, *location);
}
Expand Down
10 changes: 9 additions & 1 deletion compiler/noirc_frontend/src/monomorphization/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1386,11 +1386,13 @@ impl<'interner> Monomorphizer<'interner> {
for generic in &meta.direct_generics {
if generic.type_var.id() == id {
let item_name = self.interner.definition_name(ident.id).to_string();
let is_numeric = matches!(generic.type_var.kind(), Kind::Numeric(..));
return Err(MonomorphizationError::NoDefaultTypeInItem {
location,
generic_name: generic.name.to_string(),
item_kind: "function",
item_name,
is_numeric,
});
}
}
Expand All @@ -1402,11 +1404,13 @@ impl<'interner> Monomorphizer<'interner> {
let typ = typ.borrow();
let item_name = typ.name.to_string();
let item_kind = if typ.is_struct() { "struct" } else { "enum" };
let is_numeric = matches!(generic.type_var.kind(), Kind::Numeric(..));
return Err(MonomorphizationError::NoDefaultTypeInItem {
location,
generic_name: generic.name.to_string(),
item_kind,
item_name,
is_numeric,
});
}
}
Expand All @@ -1429,11 +1433,13 @@ impl<'interner> Monomorphizer<'interner> {
let def = def.borrow();
for generic in &def.generics {
if generic.type_var.id() == id {
let is_numeric = matches!(generic.type_var.kind(), Kind::Numeric(..));
return Err(MonomorphizationError::NoDefaultTypeInItem {
location,
generic_name: generic.name.to_string(),
item_kind: "enum",
item_name: def.name.to_string(),
is_numeric,
});
}
}
Expand All @@ -1458,7 +1464,7 @@ impl<'interner> Monomorphizer<'interner> {
| HirType::Error
| HirType::Quoted(_) => Ok(()),
HirType::Constant(_value, kind) => {
if kind.is_error() || kind.default_type().is_none() {
if kind.is_error() {
Err(MonomorphizationError::UnknownConstant { location })
} else {
Ok(())
Expand Down Expand Up @@ -2478,11 +2484,13 @@ fn check_struct_generic_type(

let def = def.borrow();
if let Some(generic) = def.generics.get(index) {
let is_numeric = matches!(generic.type_var.kind(), Kind::Numeric(..));
return Err(MonomorphizationError::NoDefaultTypeInItem {
location,
generic_name: generic.name.to_string(),
item_kind: "struct",
item_name: def.name.to_string(),
is_numeric,
});
}

Expand Down
28 changes: 28 additions & 0 deletions compiler/noirc_frontend/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4702,3 +4702,31 @@ fn only_one_private_error_when_name_in_types_and_values_namespace_collides() {
";
check_errors!(src);
}

#[named]
#[test]
fn cannot_determine_type_of_generic_argument_in_function_call_when_it_is_a_numeric_generic() {
let src = r#"
struct Foo<let N: u32> {
array: [Field; N],
}

impl<let N: u32> Foo<N> {
fn new() -> Self {
Self { array: [0; N] }
}
}

fn foo<let N: u32>() -> Foo<N> {
Foo::new()
}

fn main() {
let _ = foo();
^^^ Type annotation needed
~~~ Could not determine the value of the generic argument `N` declared on the function `foo`
}
"#;
let features = vec![UnstableFeature::Enums];
check_monomorphization_error_using_features!(src, &features);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

[package]
name = "noirc_frontend_tests_cannot_determine_type_of_generic_argument_in_function_call_when_it_is_a_numeric_generic"
type = "bin"
authors = [""]

[dependencies]
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

struct Foo<let N: u32> {
array: [Field; N],
}

impl<let N: u32> Foo<N> {
fn new() -> Self {
Self { array: [0; N] }
}
}

fn foo<let N: u32>() -> Foo<N> {
Foo::new()
}

fn main() {
let _ = foo();
}

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7627233576545093977
2 changes: 1 addition & 1 deletion test_programs/noir_test_success/ski_calculus/src/main.nr
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ impl<let N: u32> From<Node> for ShowState<N> {
}

impl<let N: u32> ShowState<N> {
pub fn step<let M: u32>(&mut self) -> Option<Id> {
pub fn step(&mut self) -> Option<Id> {
if self.done {
Option::none()
} else {
Expand Down
5 changes: 3 additions & 2 deletions tooling/lsp/src/requests/inlay_hint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -525,10 +525,11 @@ fn push_type_parts(typ: &Type, parts: &mut Vec<InlayHintLabelPart>, files: &File
}
Type::TypeVariable(binding) => match &*binding.borrow() {
TypeBinding::Unbound(_, kind) => match kind {
Kind::Any | Kind::Normal => push_type_variable_parts(binding, parts, files),
Kind::Any | Kind::Normal | Kind::Numeric(..) => {
push_type_variable_parts(binding, parts, files);
}
Kind::Integer => push_type_parts(&Type::default_int_type(), parts, files),
Kind::IntegerOrField => parts.push(string_part("Field")),
Kind::Numeric(typ) => push_type_parts(typ, parts, files),
},
_ => {
push_type_variable_parts(binding, parts, files);
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading