@@ -254,12 +254,12 @@ impl CrateGraph {
254
254
return false ;
255
255
}
256
256
257
+ if target == from {
258
+ return true ;
259
+ }
260
+
257
261
for dep in & self [ from] . dependencies {
258
262
let crate_id = dep. crate_id ;
259
- if crate_id == target {
260
- return true ;
261
- }
262
-
263
263
if self . dfs_find ( target, crate_id, visited) {
264
264
return true ;
265
265
}
@@ -369,7 +369,7 @@ mod tests {
369
369
use super :: { CfgOptions , CrateGraph , CrateName , Dependency , Edition :: Edition2018 , Env , FileId } ;
370
370
371
371
#[ test]
372
- fn it_should_panic_because_of_cycle_dependencies ( ) {
372
+ fn detect_cyclic_dependency_indirect ( ) {
373
373
let mut graph = CrateGraph :: default ( ) ;
374
374
let crate1 = graph. add_crate_root (
375
375
FileId ( 1u32 ) ,
@@ -403,6 +403,31 @@ mod tests {
403
403
assert ! ( graph. add_dep( crate3, CrateName :: new( "crate1" ) . unwrap( ) , crate1) . is_err( ) ) ;
404
404
}
405
405
406
+ #[ test]
407
+ fn detect_cyclic_dependency_direct ( ) {
408
+ let mut graph = CrateGraph :: default ( ) ;
409
+ let crate1 = graph. add_crate_root (
410
+ FileId ( 1u32 ) ,
411
+ Edition2018 ,
412
+ None ,
413
+ CfgOptions :: default ( ) ,
414
+ Env :: default ( ) ,
415
+ Default :: default ( ) ,
416
+ Default :: default ( ) ,
417
+ ) ;
418
+ let crate2 = graph. add_crate_root (
419
+ FileId ( 2u32 ) ,
420
+ Edition2018 ,
421
+ None ,
422
+ CfgOptions :: default ( ) ,
423
+ Env :: default ( ) ,
424
+ Default :: default ( ) ,
425
+ Default :: default ( ) ,
426
+ ) ;
427
+ assert ! ( graph. add_dep( crate1, CrateName :: new( "crate2" ) . unwrap( ) , crate2) . is_ok( ) ) ;
428
+ assert ! ( graph. add_dep( crate2, CrateName :: new( "crate2" ) . unwrap( ) , crate2) . is_err( ) ) ;
429
+ }
430
+
406
431
#[ test]
407
432
fn it_works ( ) {
408
433
let mut graph = CrateGraph :: default ( ) ;
0 commit comments