@@ -197,15 +197,26 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver,
197197 err. span_label ( span, "use of type variable from outer function" ) ;
198198
199199 let cm = resolver. session . source_map ( ) ;
200- let mut is_self = false ;
201200 match outer_def {
202- Def :: SelfTy ( _, maybe_impl_defid) => {
203- if let Some ( impl_span) = maybe_impl_defid. map_or ( None ,
204- |def_id| resolver. definitions . opt_span ( def_id) ) {
205- err. span_label ( reduce_impl_span_to_impl_keyword ( cm, impl_span) ,
206- "`Self` type implicitly declared here, on the `impl`" ) ;
201+ Def :: SelfTy ( maybe_trait_defid, maybe_impl_defid) => {
202+ if let Some ( impl_span) = maybe_impl_defid. and_then ( |def_id| {
203+ resolver. definitions . opt_span ( def_id)
204+ } ) {
205+ err. span_label (
206+ reduce_impl_span_to_impl_keyword ( cm, impl_span) ,
207+ "`Self` type implicitly declared here, on the `impl`" ,
208+ ) ;
209+ }
210+ match ( maybe_trait_defid, maybe_impl_defid) {
211+ ( Some ( _) , None ) => {
212+ err. span_label ( span, "can't use `Self` here" ) ;
213+ }
214+ ( _, Some ( _) ) => {
215+ err. span_label ( span, "use a type here instead" ) ;
216+ }
217+ ( None , None ) => bug ! ( "`impl` without trait nor type?" ) ,
207218 }
208- is_self = true ;
219+ return err ;
209220 } ,
210221 Def :: TyParam ( typaram_defid) => {
211222 if let Some ( typaram_span) = resolver. definitions . opt_span ( typaram_defid) {
@@ -221,12 +232,7 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver,
221232 // Try to retrieve the span of the function signature and generate a new message with
222233 // a local type parameter
223234 let sugg_msg = "try using a local type parameter instead" ;
224- if is_self {
225- // Suggest using the actual type
226- err. span_label ( span, "use a materialized type here instead" ) ;
227- } else if let Some (
228- ( sugg_span, new_snippet) ,
229- ) = cm. generate_local_type_param_snippet ( span) {
235+ if let Some ( ( sugg_span, new_snippet) ) = cm. generate_local_type_param_snippet ( span) {
230236 // Suggest the modification to the user
231237 err. span_suggestion_with_applicability (
232238 sugg_span,
0 commit comments