mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Rollup merge of #132207 - compiler-errors:tweak-res-mod-segment, r=petrochenkov
Store resolution for self and crate root module segments Let's make sure to record the segment resolution for `self::`, `crate::` and `$crate::`. I'm actually somewhat surprised that the only diagnostic that uses this is the one that errors on invalid generics on a module segment... but seems strictly more correct regardless, and there may be other diagnostics using these segments resolutions that just haven't been tested for `self`. Also includes a drive-by on `report_prohibit_generics_error`.
This commit is contained in:
commit
b1008d1370
@ -1106,7 +1106,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||
.collect::<String>()
|
||||
),
|
||||
[(only, _)] => only.to_string(),
|
||||
[] => "this type".to_string(),
|
||||
[] => bug!("expected one segment to deny"),
|
||||
};
|
||||
|
||||
let arg_spans: Vec<Span> = segments
|
||||
@ -1136,7 +1136,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||
"s",
|
||||
),
|
||||
[only] => (only.to_string(), ""),
|
||||
[] => unreachable!("expected at least one generic to prohibit"),
|
||||
[] => bug!("expected at least one generic to prohibit"),
|
||||
};
|
||||
let last_span = *arg_spans.last().unwrap();
|
||||
let span: MultiSpan = arg_spans.into();
|
||||
|
@ -1478,9 +1478,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
||||
if segment_idx == 0 {
|
||||
if name == kw::SelfLower {
|
||||
let mut ctxt = ident.span.ctxt().normalize_to_macros_2_0();
|
||||
module = Some(ModuleOrUniformRoot::Module(
|
||||
self.resolve_self(&mut ctxt, parent_scope.module),
|
||||
));
|
||||
let self_mod = self.resolve_self(&mut ctxt, parent_scope.module);
|
||||
if let Some(res) = self_mod.res() {
|
||||
record_segment_res(self, res);
|
||||
}
|
||||
module = Some(ModuleOrUniformRoot::Module(self_mod));
|
||||
continue;
|
||||
}
|
||||
if name == kw::PathRoot && ident.span.at_least_rust_2018() {
|
||||
@ -1497,7 +1499,11 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
||||
}
|
||||
if name == kw::PathRoot || name == kw::Crate || name == kw::DollarCrate {
|
||||
// `::a::b`, `crate::a::b` or `$crate::a::b`
|
||||
module = Some(ModuleOrUniformRoot::Module(self.resolve_crate_root(ident)));
|
||||
let crate_root = self.resolve_crate_root(ident);
|
||||
if let Some(res) = crate_root.res() {
|
||||
record_segment_res(self, res);
|
||||
}
|
||||
module = Some(ModuleOrUniformRoot::Module(crate_root));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
18
tests/ui/generics/generics-on-self-mod-segment.rs
Normal file
18
tests/ui/generics/generics-on-self-mod-segment.rs
Normal file
@ -0,0 +1,18 @@
|
||||
struct Ty;
|
||||
|
||||
fn self_(_: self::<i32>::Ty) {}
|
||||
//~^ ERROR type arguments are not allowed on module `generics_on_self_mod_segment`
|
||||
|
||||
fn crate_(_: crate::<i32>::Ty) {}
|
||||
//~^ ERROR type arguments are not allowed on module `generics_on_self_mod_segment`
|
||||
|
||||
macro_rules! dollar_crate {
|
||||
() => {
|
||||
fn dollar_crate_(_: $crate::<i32>::Ty) {}
|
||||
//~^ ERROR type arguments are not allowed on module `generics_on_self_mod_segment`
|
||||
}
|
||||
}
|
||||
|
||||
dollar_crate!();
|
||||
|
||||
fn main() {}
|
32
tests/ui/generics/generics-on-self-mod-segment.stderr
Normal file
32
tests/ui/generics/generics-on-self-mod-segment.stderr
Normal file
@ -0,0 +1,32 @@
|
||||
error[E0109]: type arguments are not allowed on module `generics_on_self_mod_segment`
|
||||
--> $DIR/generics-on-self-mod-segment.rs:3:20
|
||||
|
|
||||
LL | fn self_(_: self::<i32>::Ty) {}
|
||||
| ---- ^^^ type argument not allowed
|
||||
| |
|
||||
| not allowed on module `generics_on_self_mod_segment`
|
||||
|
||||
error[E0109]: type arguments are not allowed on module `generics_on_self_mod_segment`
|
||||
--> $DIR/generics-on-self-mod-segment.rs:6:22
|
||||
|
|
||||
LL | fn crate_(_: crate::<i32>::Ty) {}
|
||||
| ----- ^^^ type argument not allowed
|
||||
| |
|
||||
| not allowed on module `generics_on_self_mod_segment`
|
||||
|
||||
error[E0109]: type arguments are not allowed on module `generics_on_self_mod_segment`
|
||||
--> $DIR/generics-on-self-mod-segment.rs:11:38
|
||||
|
|
||||
LL | fn dollar_crate_(_: $crate::<i32>::Ty) {}
|
||||
| ------ ^^^ type argument not allowed
|
||||
| |
|
||||
| not allowed on module `generics_on_self_mod_segment`
|
||||
...
|
||||
LL | dollar_crate!();
|
||||
| --------------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `dollar_crate` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0109`.
|
@ -1,7 +1,7 @@
|
||||
trait Trait {}
|
||||
|
||||
fn test<T: ?self::<i32>::Trait>() {}
|
||||
//~^ ERROR type arguments are not allowed on this type
|
||||
//~^ ERROR type arguments are not allowed on module `maybe_bound_has_path_args`
|
||||
//~| WARN relaxing a default bound only does something for `?Sized`
|
||||
|
||||
fn main() {}
|
||||
|
@ -4,13 +4,13 @@ warning: relaxing a default bound only does something for `?Sized`; all other tr
|
||||
LL | fn test<T: ?self::<i32>::Trait>() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0109]: type arguments are not allowed on this type
|
||||
error[E0109]: type arguments are not allowed on module `maybe_bound_has_path_args`
|
||||
--> $DIR/maybe-bound-has-path-args.rs:3:20
|
||||
|
|
||||
LL | fn test<T: ?self::<i32>::Trait>() {}
|
||||
| ---- ^^^ type argument not allowed
|
||||
| |
|
||||
| not allowed on this type
|
||||
| not allowed on module `maybe_bound_has_path_args`
|
||||
|
||||
error: aborting due to 1 previous error; 1 warning emitted
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user