Skip to content

Commit f7ecf1c

Browse files
suggest tuple struct syntax
1 parent b01a257 commit f7ecf1c

File tree

3 files changed

+49
-34
lines changed

3 files changed

+49
-34
lines changed

src/librustc_typeck/check/expr.rs

+41-30
Original file line numberDiff line numberDiff line change
@@ -1215,38 +1215,49 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
12151215
}
12161216
},
12171217
ty);
1218-
// prevent all specified fields from being suggested
1219-
let skip_fields = skip_fields.iter().map(|ref x| x.ident.as_str());
1220-
if let Some(field_name) = Self::suggest_field_name(variant,
1221-
&field.ident.as_str(),
1222-
skip_fields.collect()) {
1223-
err.span_suggestion(
1224-
field.ident.span,
1225-
"a field with a similar name exists",
1226-
field_name.to_string(),
1227-
Applicability::MaybeIncorrect,
1228-
);
1229-
} else {
1230-
match ty.sty {
1231-
ty::Adt(adt, ..) => {
1232-
if adt.is_enum() {
1233-
err.span_label(field.ident.span,
1234-
format!("`{}::{}` does not have this field",
1235-
ty, variant.ident));
1236-
} else {
1237-
err.span_label(field.ident.span,
1238-
format!("`{}` does not have this field", ty));
1239-
}
1240-
let available_field_names = self.available_field_names(variant);
1241-
if !available_field_names.is_empty() {
1242-
err.note(&format!("available fields are: {}",
1243-
self.name_series_display(available_field_names)));
1218+
match variant.ctor_kind {
1219+
CtorKind::Fn => {
1220+
err.span_label(field.ident.span, "field does not exist");
1221+
err.span_label(
1222+
field.ident.span,
1223+
format!("`{adt}` is a tuple {kind_name}, use the appropriate syntax: `{adt}(/* fields */)`", adt=ty, kind_name=kind_name)
1224+
);
1225+
}
1226+
_ => {
1227+
// prevent all specified fields from being suggested
1228+
let skip_fields = skip_fields.iter().map(|ref x| x.ident.as_str());
1229+
if let Some(field_name) = Self::suggest_field_name(variant,
1230+
&field.ident.as_str(),
1231+
skip_fields.collect()) {
1232+
err.span_suggestion(
1233+
field.ident.span,
1234+
"a field with a similar name exists",
1235+
field_name.to_string(),
1236+
Applicability::MaybeIncorrect,
1237+
);
1238+
} else {
1239+
match ty.sty {
1240+
ty::Adt(adt, ..) => {
1241+
if adt.is_enum() {
1242+
err.span_label(field.ident.span,
1243+
format!("`{}::{}` does not have this field",
1244+
ty, variant.ident));
1245+
} else {
1246+
err.span_label(field.ident.span,
1247+
format!("`{}` does not have this field", ty));
1248+
}
1249+
let available_field_names = self.available_field_names(variant);
1250+
if !available_field_names.is_empty() {
1251+
err.note(&format!("available fields are: {}",
1252+
self.name_series_display(available_field_names)));
1253+
}
1254+
}
1255+
_ => bug!("non-ADT passed to report_unknown_field")
12441256
}
1245-
}
1246-
_ => bug!("non-ADT passed to report_unknown_field")
1257+
};
12471258
}
1248-
};
1249-
err.emit();
1259+
}
1260+
err.emit();
12501261
}
12511262

12521263
// Return an hint about the closest match in field names

src/test/ui/issues/issue-4736.stderr

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ error[E0560]: struct `NonCopyable` has no field named `p`
22
--> $DIR/issue-4736.rs:4:26
33
|
44
LL | let z = NonCopyable{ p: () };
5-
| ^ help: a field with a similar name exists: `0`
5+
| ^
6+
| |
7+
| field does not exist
8+
| `NonCopyable` is a tuple struct, use the appropriate syntax: `NonCopyable(/* fields */)`
69

710
error: aborting due to previous error
811

src/test/ui/numeric/numeric-fields.stderr

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ error[E0560]: struct `S` has no field named `0b1`
22
--> $DIR/numeric-fields.rs:4:15
33
|
44
LL | let s = S{0b1: 10, 0: 11};
5-
| ^^^ `S` does not have this field
6-
|
7-
= note: available fields are: `0`, `1`
5+
| ^^^
6+
| |
7+
| field does not exist
8+
| `S` is a tuple struct, use the appropriate syntax: `S(/* fields */)`
89

910
error[E0026]: struct `S` does not have a field named `0x1`
1011
--> $DIR/numeric-fields.rs:7:17

0 commit comments

Comments
 (0)