Files
swift-mirror/test/Serialization/circular-import.swift
Jordan Rose df2e63d07d Diagnose modules with circular dependencies (#16075)
This can't arise from a clean build, but it can happen if you have
products lingering in a search path and then either rebuild one of
the modules in the cycle, or change the search paths.

The way this is implemented is for each module to track whether its
imports have all been resolved. If, when loading a module, one of its
dependencies hasn't resolved all of its imports yet, then we know
there's a cycle.

This doesn't produce the best diagnostics, but it's hard to get into
this state in the first place, so that's probably okay.

https://bugs.swift.org/browse/SR-7483
2018-05-02 15:01:09 -07:00

35 lines
1.5 KiB
Swift

// Circularities involving the module currently being type-checked.
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module %s -module-name A -o %t
// RUN: %target-swift-frontend -emit-module %s -module-name B -D IMPORT_A -I %t -o %t
// RUN: not %target-swift-frontend -typecheck %s -module-name A -D IMPORT_B -I %t 2>&1 | %FileCheck -check-prefix CHECK-ABA %s
// RUN: %target-swift-frontend -emit-module %s -module-name C -D IMPORT_B -I %t -o %t
// RUN: not %target-swift-frontend -typecheck %s -module-name A -D IMPORT_C -I %t 2>&1 | %FileCheck -check-prefix CHECK-ABCA %s
// Circularities not involving the module currently being type-checked.
// RUN: %empty-directory(%t/plain)
// RUN: %target-swift-frontend -emit-module %s -module-name A -o %t/plain
// RUN: %target-swift-frontend -emit-module %s -module-name B -o %t/plain
// RUN: %empty-directory(%t/cycle)
// RUN: %target-swift-frontend -emit-module %s -module-name A -D IMPORT_B -o %t/cycle -I %t/plain
// RUN: %target-swift-frontend -emit-module %s -module-name B -D IMPORT_A -o %t/cycle -I %t/plain
// RUN: not %target-swift-frontend -typecheck %s -module-name C -D IMPORT_A -I %t/cycle 2>&1 | %FileCheck -check-prefix CHECK-ABA-BUILT %s
#if IMPORT_A
import A
// CHECK-ABA-BUILT: <unknown>:0: error: circular dependency between modules 'A' and 'B'
#endif
#if IMPORT_B
import B
// CHECK-ABA: :[[@LINE-1]]:8: error: circular dependency between modules 'A' and 'B'
#endif
#if IMPORT_C
import C
// CHECK-ABCA: <unknown>:0: error: circular dependency between modules 'A' and 'B'
#endif