diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs index 1fcd6e92305f5..f3d67feb5ca80 100644 --- a/src/librustc/middle/mem_categorization.rs +++ b/src/librustc/middle/mem_categorization.rs @@ -1196,7 +1196,18 @@ impl<'t, 'a,'tcx> MemCategorizationContext<'t, 'a, 'tcx> { (*op)(self, cmt.clone(), pat); - let opt_def = self.tcx().def_map.borrow().get(&pat.id).map(|d| d.full_def()); + let opt_def = if let Some(path_res) = self.tcx().def_map.borrow().get(&pat.id) { + if path_res.depth != 0 { + // Since patterns can be associated constants + // which are resolved during typeck, we might have + // some unresolved patterns reaching this stage + // without aborting + return Err(()); + } + Some(path_res.full_def()) + } else { + None + }; // Note: This goes up here (rather than within the PatEnum arm // alone) because struct patterns can refer to struct types or diff --git a/src/test/compile-fail/issue-28971.rs b/src/test/compile-fail/issue-28971.rs new file mode 100644 index 0000000000000..1d14b71a40e4f --- /dev/null +++ b/src/test/compile-fail/issue-28971.rs @@ -0,0 +1,27 @@ +// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// This should not cause an ICE + +enum Foo { + Bar(u8) +} +fn main(){ + foo(|| { + match Foo::Bar(1) { + Foo::Baz(..) => (), //~ ERROR no associated + _ => (), + } + }); +} + +fn foo(f: F) where F: FnMut() { + f(); +}