mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
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
35 lines
1.5 KiB
Swift
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
|