about summary refs log tree commit diff
path: root/src/librustc_resolve
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-09-09 04:00:21 +0000
committerbors <bors@rust-lang.org>2018-09-09 04:00:21 +0000
commitdac76020a5a33fa723d578043e422455e598620b (patch)
treea01edd1737815d8dbf4b27c8c4b818233baa7de4 /src/librustc_resolve
parent004bc5a33cd44cd0896cae917a75488579126da5 (diff)
parentbebecf850ab2a8c9df298bd3ab3b12ca8ea83c41 (diff)
downloadrust-dac76020a5a33fa723d578043e422455e598620b.tar.gz
rust-dac76020a5a33fa723d578043e422455e598620b.zip
Auto merge of #53960 - estebank:issue-51303, r=nagisa
Fix incorrect outer function type parameter message

Fix #51303.
Diffstat (limited to 'src/librustc_resolve')
-rw-r--r--src/librustc_resolve/lib.rs23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index 65fe01ff96a..453e7421ff1 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -198,12 +198,25 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver,
 
             let cm = resolver.session.source_map();
             match outer_def {
-                Def::SelfTy(_, maybe_impl_defid) => {
-                    if let Some(impl_span) = maybe_impl_defid.map_or(None,
-                            |def_id| resolver.definitions.opt_span(def_id)) {
-                        err.span_label(reduce_impl_span_to_impl_keyword(cm, impl_span),
-                                    "`Self` type implicitly declared here, on the `impl`");
+                Def::SelfTy(maybe_trait_defid, maybe_impl_defid) => {
+                    if let Some(impl_span) = maybe_impl_defid.and_then(|def_id| {
+                        resolver.definitions.opt_span(def_id)
+                    }) {
+                        err.span_label(
+                            reduce_impl_span_to_impl_keyword(cm, impl_span),
+                            "`Self` type implicitly declared here, by this `impl`",
+                        );
+                    }
+                    match (maybe_trait_defid, maybe_impl_defid) {
+                        (Some(_), None) => {
+                            err.span_label(span, "can't use `Self` here");
+                        }
+                        (_, Some(_)) => {
+                            err.span_label(span, "use a type here instead");
+                        }
+                        (None, None) => bug!("`impl` without trait nor type?"),
                     }
+                    return err;
                 },
                 Def::TyParam(typaram_defid) => {
                     if let Some(typaram_span) = resolver.definitions.opt_span(typaram_defid) {