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:
Matthias Krüger 2024-11-09 19:16:46 +01:00 committed by GitHub
commit 3aa1a24799
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 29 additions and 3 deletions

View File

@ -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,
} }
} }

View File

@ -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]
} }

View File

@ -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`.