Rollup merge of #132799 - zachs18:str-primitive-symbol, r=compiler-errors
Make `Ty::primitive_symbol` recognize `str` Make `Ty::primitive_symbol` recognize `str`, which makes `str` eligible for the "expected primitive, found local type" (and vice versa) [diagnostic](https://github.com/rust-lang/rust/blob/master/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs#L1430-L1437) that already exists for other primitives. <details><summary> diagnostic difference</summary> ```rs #[allow(non_camel_case_types)] struct str; fn foo() { let _: &str = "hello"; let _: &core::primitive::str = &str; } ``` `rustc --crate-type lib --edition 2021 a.rs` Current nightly: ```rs error[E0308]: mismatched types --> a.rs:5:19 | 5 | let _: &str = "hello"; | ---- ^^^^^^^ expected `str`, found a different `str` | | | expected due to this | = note: expected reference `&str` found reference `&'static str` error[E0308]: mismatched types --> a.rs:6:36 | 6 | let _: &core::primitive::str = &str; | --------------------- ^^^^ expected `str`, found a different `str` | | | expected due to this | = note: expected reference `&str` (`str`) found reference `&str` (`str`) error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0308`. ``` With this patch: ```rs error[E0308]: mismatched types --> a.rs:5:19 | 5 | let _: &str = "hello"; | ---- ^^^^^^^ expected `str`, found a different `str` | | | expected due to this | = note: str and `str` have similar names, but are actually distinct types = note: str is a primitive defined by the language note: `str` is defined in the current crate --> a.rs:2:1 | 2 | struct str; | ^^^^^^^^^^ error[E0308]: mismatched types --> a.rs:6:36 | 6 | let _: &core::primitive::str = &str; | --------------------- ^^^^ expected `str`, found a different `str` | | | expected due to this | = note: str and `str` have similar names, but are actually distinct types = note: str is a primitive defined by the language note: `str` is defined in the current crate --> a.rs:2:1 | 2 | struct str; | ^^^^^^^^^^ error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0308`. ``` </details>
This commit is contained in:
commit
3aa1a24799
@ -1933,6 +1933,7 @@ pub fn primitive_symbol(self) -> Option<Symbol> {
|
|||||||
ty::UintTy::U64 => Some(sym::u64),
|
ty::UintTy::U64 => Some(sym::u64),
|
||||||
ty::UintTy::U128 => Some(sym::u128),
|
ty::UintTy::U128 => Some(sym::u128),
|
||||||
},
|
},
|
||||||
|
ty::Str => Some(sym::str),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
struct bool;
|
struct bool;
|
||||||
|
struct str;
|
||||||
|
|
||||||
fn foo(_: bool) {}
|
fn foo(_: bool) {}
|
||||||
|
fn bar(_: &str) {}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
foo(true);
|
foo(true);
|
||||||
//~^ ERROR mismatched types [E0308]
|
//~^ ERROR mismatched types [E0308]
|
||||||
|
bar("hello");
|
||||||
|
//~^ ERROR mismatched types [E0308]
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/similar_paths_primitive.rs:8:9
|
--> $DIR/similar_paths_primitive.rs:10:9
|
||||||
|
|
|
|
||||||
LL | foo(true);
|
LL | foo(true);
|
||||||
| --- ^^^^ expected `bool`, found a different `bool`
|
| --- ^^^^ expected `bool`, found a different `bool`
|
||||||
@ -14,11 +14,32 @@ note: `bool` is defined in the current crate
|
|||||||
LL | struct bool;
|
LL | struct bool;
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
note: function defined here
|
note: function defined here
|
||||||
--> $DIR/similar_paths_primitive.rs:5:4
|
--> $DIR/similar_paths_primitive.rs:6:4
|
||||||
|
|
|
|
||||||
LL | fn foo(_: bool) {}
|
LL | fn foo(_: bool) {}
|
||||||
| ^^^ -------
|
| ^^^ -------
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/similar_paths_primitive.rs:12:9
|
||||||
|
|
|
||||||
|
LL | bar("hello");
|
||||||
|
| --- ^^^^^^^ expected `str`, found a different `str`
|
||||||
|
| |
|
||||||
|
| arguments to this function are incorrect
|
||||||
|
|
|
||||||
|
= note: str and `str` have similar names, but are actually distinct types
|
||||||
|
= note: str is a primitive defined by the language
|
||||||
|
note: `str` is defined in the current crate
|
||||||
|
--> $DIR/similar_paths_primitive.rs:4:1
|
||||||
|
|
|
||||||
|
LL | struct str;
|
||||||
|
| ^^^^^^^^^^
|
||||||
|
note: function defined here
|
||||||
|
--> $DIR/similar_paths_primitive.rs:7:4
|
||||||
|
|
|
||||||
|
LL | fn bar(_: &str) {}
|
||||||
|
| ^^^ -------
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0308`.
|
For more information about this error, try `rustc --explain E0308`.
|
||||||
|
Loading…
Reference in New Issue
Block a user