diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 6dfa506d5e8fb..1f8d23fd4dc0d 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -2361,8 +2361,18 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { "type name" }; - let msg = format!("use of undeclared {} `{}`", kind, - path_names_to_string(path, 0)); + let self_type_name = special_idents::type_self.name; + let is_invalid_self_type_name = + path.segments.len() > 0 && + maybe_qself.is_none() && + path.segments[0].identifier.name == self_type_name; + let msg = if is_invalid_self_type_name { + "use of `Self` outside of an impl or trait".to_string() + } else { + format!("use of undeclared {} `{}`", + kind, path_names_to_string(path, 0)) + }; + self.resolve_error(ty.span, &msg[..]); } } diff --git a/src/test/compile-fail/issue-12796.rs b/src/test/compile-fail/issue-12796.rs index ce3c8c52b0e47..2249741cdaac5 100644 --- a/src/test/compile-fail/issue-12796.rs +++ b/src/test/compile-fail/issue-12796.rs @@ -12,7 +12,7 @@ trait Trait { fn outer(self) { fn inner(_: Self) { //~^ ERROR can't use type parameters from outer function - //~^^ ERROR use of undeclared type name `Self` + //~^^ ERROR use of `Self` outside of an impl or trait } } } diff --git a/src/test/compile-fail/issue-24968.rs b/src/test/compile-fail/issue-24968.rs new file mode 100644 index 0000000000000..f51b77b0ee539 --- /dev/null +++ b/src/test/compile-fail/issue-24968.rs @@ -0,0 +1,15 @@ +// Copyright 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. + +fn foo(_: Self) { + //~^ ERROR use of `Self` outside of an impl or trait +} + +fn main() {}