@@ -147,26 +147,80 @@ pub fn unreachable_panic() {
147147 }
148148}
149149
150- pub fn unreachable_match ( ) {
151- match get_a_number ( ) {
152- 1 => {
153- return ;
154- }
155- _ => {
156- do_something ( ) ;
157- }
150+ macro_rules! bail_1 {
151+ ( ) => {
152+ return Err ( String :: from( "message" ) )
153+ } ;
154+ }
155+
156+ macro_rules! bail_2 {
157+ ( $message: literal) => {
158+ return Err ( String :: from( $message) )
159+ } ;
160+ }
161+
162+ pub fn unreachable_bail ( ) -> Result < i32 , String > {
163+ if cond ( ) {
164+ do_something ( ) ;
165+ return Err ( String :: from ( "message" ) ) ;
166+ do_something ( ) ; // $ Alert[rust/dead-code]
167+ }
168+
169+ if cond ( ) {
170+ do_something ( ) ;
171+ bail_1 ! ( ) ; // $ SPURIOUS: Alert[rust/dead-code]
172+ do_something ( ) ; // $ MISSING: Alert[rust/dead-code]
173+ }
174+
175+ if cond ( ) {
176+ do_something ( ) ;
177+ bail_2 ! ( "message" ) ; // $ SPURIOUS: Alert[rust/dead-code]
158178 }
159179 do_something ( ) ;
160180
161- match get_a_number ( ) {
162- 1 => {
163- return ;
181+ Ok ( 1 )
182+ }
183+
184+ pub fn unreachable_match ( ) {
185+ if cond ( ) {
186+ match get_a_number ( ) {
187+ 1 => {
188+ return ;
189+ }
190+ _ => {
191+ do_something ( ) ;
192+ }
164193 }
165- _ => {
166- return ;
194+ do_something ( ) ;
195+ }
196+
197+ if cond ( ) {
198+ match get_a_number ( ) {
199+ 1 => {
200+ return ;
201+ }
202+ _ => {
203+ return ;
204+ }
167205 }
206+ do_something ( ) ; // $ Alert[rust/dead-code]
207+ }
208+
209+ if cond ( ) {
210+ _ = match get_a_number ( ) {
211+ 1 => "One" ,
212+ _ => "Some"
213+ } ;
214+ do_something ( ) ;
215+ }
216+
217+ if cond ( ) {
218+ _ = Some ( match get_a_number ( ) {
219+ 1 => "One" ,
220+ _ => "Some"
221+ } ) ;
222+ do_something ( ) ;
168223 }
169- do_something ( ) ; // $ Alert[rust/dead-code]
170224}
171225
172226pub fn unreachable_loop ( ) {
@@ -214,6 +268,46 @@ pub fn unreachable_loop() {
214268 do_something ( ) ;
215269 do_something ( ) ;
216270 }
271+
272+ if cond ( ) {
273+ fn do_nothing ( ) { } ;
274+ fn loop_forever ( ) { loop { } } ;
275+ fn take_a_fn ( _: fn ( ) -> ( ) ) {
276+ } ;
277+ fn call_a_fn ( f : fn ( ) -> ( ) ) {
278+ f ( ) ;
279+ } ;
280+
281+ take_a_fn ( do_nothing ) ;
282+ call_a_fn ( do_nothing ) ;
283+ take_a_fn ( loop_forever ) ;
284+ call_a_fn ( loop_forever ) ;
285+ do_something ( ) ; // $ MISSING: Alert[rust/dead-code]
286+ }
287+ }
288+
289+ async fn do_something_async ( ) { }
290+
291+ pub async fn unreachable_loop_async ( ) {
292+ let for_ten = async { // $ SPURIOUS: Alert[rust/unused-value]
293+ for _ in 1 ..10 {
294+ do_something_async ( ) . await ;
295+ }
296+ do_something ( ) ;
297+ } ;
298+
299+ let for_ever = async { // $ SPURIOUS: Alert[rust/unused-value]
300+ loop {
301+ do_something_async ( ) . await ;
302+ }
303+ do_something ( ) ; // $ Alert[rust/dead-code]
304+ } ;
305+
306+ do_something ( ) ;
307+ for_ten. await ;
308+ do_something ( ) ;
309+ for_ever. await ;
310+ do_something ( ) ; // $ MISSING: Alert[rust/dead-code]
217311}
218312
219313pub fn unreachable_paren ( ) {
@@ -257,3 +351,33 @@ pub fn unreachable_let_2() {
257351
258352 do_something ( ) ;
259353}
354+
355+ #[ cfg( not( foo) ) ]
356+ pub fn unreachable_attributes ( ) {
357+ // `#[cfg` and `cfg!` checks can go either way, we should not assume this
358+ // function or either branch below is unreachable.
359+ if cfg ! ( bar) {
360+ do_something ( ) ;
361+ } else {
362+ do_something ( ) ;
363+ }
364+
365+ #[ doc="This is a doc comment declared through an attribute." ]
366+
367+ if ( true ) {
368+ do_something ( ) ;
369+ } else {
370+ do_something ( ) ; // $ Alert[rust/dead-code]
371+ }
372+ }
373+
374+ const _: ( ) = {
375+ _ = 1 ; // $ SPURIOUS: Alert[rust/dead-code]
376+ } ;
377+
378+ const _: ( ) = {
379+ const fn foo ( ) {
380+ _ = 1 ;
381+ } ;
382+ foo ( ) ; // $ SPURIOUS: Alert[rust/dead-code]
383+ } ;
0 commit comments