@@ -65,13 +65,25 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
6565 true
6666 } else {
6767 match t. sty {
68- ty:: Adt ( def, _) => check_must_use ( cx, def. did , s. span , "" ) ,
68+ ty:: Adt ( def, _) => check_must_use ( cx, def. did , s. span , "" , "" ) ,
6969 ty:: Opaque ( def, _) => {
7070 let mut must_use = false ;
7171 for ( predicate, _) in cx. tcx . predicates_of ( def) . predicates {
7272 if let ty:: Predicate :: Trait ( ref poly_trait_predicate) = predicate {
7373 let trait_ref = poly_trait_predicate. skip_binder ( ) . trait_ref ;
74- if check_must_use ( cx, trait_ref. def_id , s. span , "implementer of " ) {
74+ if check_must_use ( cx, trait_ref. def_id , s. span , "implementer of " , "" ) {
75+ must_use = true ;
76+ break ;
77+ }
78+ }
79+ }
80+ must_use
81+ }
82+ ty:: Dynamic ( binder, _) => {
83+ let mut must_use = false ;
84+ for predicate in binder. skip_binder ( ) . iter ( ) {
85+ if let ty:: ExistentialPredicate :: Trait ( ref trait_ref) = predicate {
86+ if check_must_use ( cx, trait_ref. def_id , s. span , "" , " trait object" ) {
7587 must_use = true ;
7688 break ;
7789 }
@@ -107,7 +119,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
107119 } ;
108120 if let Some ( def) = maybe_def {
109121 let def_id = def. def_id ( ) ;
110- fn_warned = check_must_use ( cx, def_id, s. span , "return value of " ) ;
122+ fn_warned = check_must_use ( cx, def_id, s. span , "return value of " , "" ) ;
111123 } else if type_permits_lack_of_use {
112124 // We don't warn about unused unit or uninhabited types.
113125 // (See https://github.com/rust-lang/rust/issues/43806 for details.)
@@ -161,11 +173,17 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
161173 cx. span_lint ( UNUSED_RESULTS , s. span , "unused result" ) ;
162174 }
163175
164- fn check_must_use ( cx : & LateContext , def_id : DefId , sp : Span , describe_path : & str ) -> bool {
176+ fn check_must_use (
177+ cx : & LateContext ,
178+ def_id : DefId ,
179+ sp : Span ,
180+ descr_pre_path : & str ,
181+ descr_post_path : & str ,
182+ ) -> bool {
165183 for attr in cx. tcx . get_attrs ( def_id) . iter ( ) {
166184 if attr. check_name ( "must_use" ) {
167- let msg = format ! ( "unused {}`{}` that must be used" ,
168- describe_path , cx. tcx. item_path_str( def_id) ) ;
185+ let msg = format ! ( "unused {}`{}`{} that must be used" ,
186+ descr_pre_path , descr_post_path , cx. tcx. item_path_str( def_id) ) ;
169187 let mut err = cx. struct_span_lint ( UNUSED_MUST_USE , sp, & msg) ;
170188 // check for #[must_use = "..."]
171189 if let Some ( note) = attr. value_str ( ) {
0 commit comments