mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 02:33:55 +00:00
Auto merge of #44945 - petrochenkov:fixtyrec, r=arielb1
Do not require semantic types for all syntactic types when there are errors Fixes https://github.com/rust-lang/rust/issues/44814 Fixes https://github.com/rust-lang/rust/issues/44858 Fixes https://github.com/rust-lang/rust/issues/44946 r? @nikomatsakis
This commit is contained in:
commit
3651cddc44
@ -988,16 +988,6 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Def::Err => {
|
Def::Err => {
|
||||||
for segment in &path.segments {
|
|
||||||
segment.with_parameters(|parameters| {
|
|
||||||
for ty in ¶meters.types {
|
|
||||||
self.ast_ty_to_ty(ty);
|
|
||||||
}
|
|
||||||
for binding in ¶meters.bindings {
|
|
||||||
self.ast_ty_to_ty(&binding.ty);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
self.set_tainted_by_errors();
|
self.set_tainted_by_errors();
|
||||||
return self.tcx().types.err;
|
return self.tcx().types.err;
|
||||||
}
|
}
|
||||||
|
@ -2009,7 +2009,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
|||||||
pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
|
pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
|
||||||
match self.tables.borrow().node_types().get(id) {
|
match self.tables.borrow().node_types().get(id) {
|
||||||
Some(&t) => t,
|
Some(&t) => t,
|
||||||
None if self.err_count_since_creation() != 0 => self.tcx.types.err,
|
None if self.is_tainted_by_errors() => self.tcx.types.err,
|
||||||
None => {
|
None => {
|
||||||
let node_id = self.tcx.hir.definitions().find_node_for_hir_id(id);
|
let node_id = self.tcx.hir.definitions().find_node_for_hir_id(id);
|
||||||
bug!("no type for node {}: {} in fcx {}",
|
bug!("no type for node {}: {} in fcx {}",
|
||||||
|
@ -8,10 +8,29 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
// Type arguments of unresolved types should have their types recorded
|
// Type arguments in unresolved entities (reporting errors before type checking)
|
||||||
|
// should have their types recorded.
|
||||||
|
|
||||||
fn main() {
|
trait Tr<T> {}
|
||||||
|
|
||||||
|
fn local_type() {
|
||||||
let _: Nonexistent<u8, Assoc = u16>; //~ ERROR cannot find type `Nonexistent` in this scope
|
let _: Nonexistent<u8, Assoc = u16>; //~ ERROR cannot find type `Nonexistent` in this scope
|
||||||
|
|
||||||
let _ = |a, b: _| -> _ { 0 };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn ufcs_trait() {
|
||||||
|
<u8 as Tr<u8>>::nonexistent(); //~ ERROR cannot find method or associated constant `nonexistent`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ufcs_item() {
|
||||||
|
NonExistent::Assoc::<u8>; //~ ERROR undeclared type or module `NonExistent`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn method() {
|
||||||
|
nonexistent.nonexistent::<u8>(); //~ ERROR cannot find value `nonexistent`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn closure() {
|
||||||
|
let _ = |a, b: _| -> _ { 0 }; // OK
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user