Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/expr.rs')
-rw-r--r--crates/hir-ty/src/diagnostics/expr.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/crates/hir-ty/src/diagnostics/expr.rs b/crates/hir-ty/src/diagnostics/expr.rs
index 0b5f131924..d8700e2777 100644
--- a/crates/hir-ty/src/diagnostics/expr.rs
+++ b/crates/hir-ty/src/diagnostics/expr.rs
@@ -547,8 +547,8 @@ pub fn record_literal_missing_fields(
id: ExprId,
expr: &Expr,
) -> Option<(VariantId, Vec<LocalFieldId>, /*exhaustive*/ bool)> {
- let (fields, exhaustive) = match expr {
- Expr::RecordLit { fields, spread, .. } => (fields, spread.is_none()),
+ let (fields, exhaustive, ellipsis) = match expr {
+ Expr::RecordLit { fields, spread, ellipsis, .. } => (fields, spread.is_none(), *ellipsis),
_ => return None,
};
@@ -563,7 +563,13 @@ pub fn record_literal_missing_fields(
let missed_fields: Vec<LocalFieldId> = variant_data
.fields()
.iter()
- .filter_map(|(f, d)| if specified_fields.contains(&d.name) { None } else { Some(f) })
+ .filter_map(|(f, d)| {
+ if (ellipsis && d.has_default) || specified_fields.contains(&d.name) {
+ None
+ } else {
+ Some(f)
+ }
+ })
.collect();
if missed_fields.is_empty() {
return None;