@@ -197,15 +197,26 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver,
197
197
err. span_label ( span, "use of type variable from outer function" ) ;
198
198
199
199
let cm = resolver. session . source_map ( ) ;
200
- let mut is_self = false ;
201
200
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?" ) ,
207
218
}
208
- is_self = true ;
219
+ return err ;
209
220
} ,
210
221
Def :: TyParam ( typaram_defid) => {
211
222
if let Some ( typaram_span) = resolver. definitions . opt_span ( typaram_defid) {
@@ -221,12 +232,7 @@ fn resolve_struct_error<'sess, 'a>(resolver: &'sess Resolver,
221
232
// Try to retrieve the span of the function signature and generate a new message with
222
233
// a local type parameter
223
234
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) {
230
236
// Suggest the modification to the user
231
237
err. span_suggestion_with_applicability (
232
238
sugg_span,
0 commit comments