mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-29 16:13:40 +00:00
check if the self type is ty::Float
before getting second substs
This commit is contained in:
parent
edabf59ca4
commit
b8418485bc
@ -2937,19 +2937,15 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
ObligationCauseCode::BinOp { rhs_span: Some(span), is_lit, .. } if *is_lit => span,
|
||||
_ => return,
|
||||
};
|
||||
match (
|
||||
trait_ref.skip_binder().self_ty().kind(),
|
||||
trait_ref.skip_binder().substs.type_at(1).kind(),
|
||||
) {
|
||||
(ty::Float(_), ty::Infer(InferTy::IntVar(_))) => {
|
||||
err.span_suggestion_verbose(
|
||||
rhs_span.shrink_to_hi(),
|
||||
"consider using a floating-point literal by writing it with `.0`",
|
||||
".0",
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
if let ty::Float(_) = trait_ref.skip_binder().self_ty().kind()
|
||||
&& let ty::Infer(InferTy::IntVar(_)) = trait_ref.skip_binder().substs.type_at(1).kind()
|
||||
{
|
||||
err.span_suggestion_verbose(
|
||||
rhs_span.shrink_to_hi(),
|
||||
"consider using a floating-point literal by writing it with `.0`",
|
||||
".0",
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
18
src/test/ui/traits/issue-102989.rs
Normal file
18
src/test/ui/traits/issue-102989.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// compile-flags: -Cinstrument-coverage
|
||||
//~^ ERROR can't find crate for `profiler_builtins`
|
||||
|
||||
#![no_core]
|
||||
#![feature(no_core, lang_items)]
|
||||
#[lang="sized"]
|
||||
trait Sized { } //~ ERROR found duplicate lang item `sized`
|
||||
|
||||
fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
|
||||
//~^ ERROR `self` parameter is only allowed in associated functions
|
||||
//~| ERROR cannot find type `Struct` in this scope
|
||||
//~| ERROR mismatched types
|
||||
let x = x << 1;
|
||||
//~^ ERROR the size for values of type `{integer}` cannot be known at compilation time
|
||||
//~| ERROR cannot find value `x` in this scope
|
||||
}
|
||||
|
||||
fn main() {}
|
72
src/test/ui/traits/issue-102989.stderr
Normal file
72
src/test/ui/traits/issue-102989.stderr
Normal file
@ -0,0 +1,72 @@
|
||||
error: `self` parameter is only allowed in associated functions
|
||||
--> $DIR/issue-102989.rs:9:15
|
||||
|
|
||||
LL | fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
|
||||
| ^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated functions are those in `impl` or `trait` definitions
|
||||
|
||||
error[E0412]: cannot find type `Struct` in this scope
|
||||
--> $DIR/issue-102989.rs:9:22
|
||||
|
|
||||
LL | fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
|
||||
| ^^^^^^ not found in this scope
|
||||
|
||||
error[E0425]: cannot find value `x` in this scope
|
||||
--> $DIR/issue-102989.rs:13:13
|
||||
|
|
||||
LL | let x = x << 1;
|
||||
| ^ help: a local variable with a similar name exists: `f`
|
||||
|
||||
error: `profiler_builtins` crate (required by compiler options) is not compatible with crate attribute `#![no_core]`
|
||||
|
||||
error[E0463]: can't find crate for `profiler_builtins`
|
||||
|
|
||||
= note: the compiler may have been built without the profiler runtime
|
||||
|
||||
error[E0152]: found duplicate lang item `sized`
|
||||
--> $DIR/issue-102989.rs:7:1
|
||||
|
|
||||
LL | trait Sized { }
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: the lang item is first defined in crate `core`.
|
||||
= note: first definition in `core` loaded from $BUILD_DIR/aarch64-apple-darwin/stage1/lib/rustlib/aarch64-apple-darwin/lib/libcore-500f4c12402b1108.rlib
|
||||
= note: second definition in the local crate (`issue_102989`)
|
||||
|
||||
error: `#[panic_handler]` function required, but not found
|
||||
|
||||
error: language item required, but not found: `eh_personality`
|
||||
|
|
||||
= note: this can occur when a binary crate with `#![no_std]` is compiled for a target where `eh_personality` is defined in the standard library
|
||||
= help: you may be able to compile for a target that doesn't need `eh_personality`, specify a target with `--target` or in `.cargo/config`
|
||||
|
||||
error[E0277]: the size for values of type `{integer}` cannot be known at compilation time
|
||||
--> $DIR/issue-102989.rs:13:15
|
||||
|
|
||||
LL | let x = x << 1;
|
||||
| ^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `core::marker::Sized` is not implemented for `{integer}`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-102989.rs:9:42
|
||||
|
|
||||
LL | fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
|
||||
| ---------- ^^^^ expected `&u32`, found `()`
|
||||
| |
|
||||
| implicitly returns `()` as its body has no tail or `return` expression
|
||||
|
|
||||
note: consider returning one of these bindings
|
||||
--> $DIR/issue-102989.rs:9:30
|
||||
|
|
||||
LL | fn ref_Struct(self: &Struct, f: &u32) -> &u32 {
|
||||
| ^
|
||||
...
|
||||
LL | let x = x << 1;
|
||||
| ^
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0152, E0277, E0308, E0412, E0425, E0463.
|
||||
For more information about an error, try `rustc --explain E0152`.
|
Loading…
Reference in New Issue
Block a user