Fundamentally, the issue is that the Swift compiler (ClangImporter in particular) intentionally restricts the resolution of forward declarations of Swift types that originate outside the declaration's Clang module. In this example, the type is declared in BTarget, forward-declared in ATarget, and if a subsequent Swift module imports ATarget. Regardless of whether or not BTarget is also imported, ClangImporter will refuse to fully-form the definition of the type in BTarget due to the potential dependency cycles. To be clear, this issue only affects forward declarations of types defined outside the current module, across modular boundaries – import-underlying-module situations are allowed to use forward declarations in this way.
I had a long talk with @allevato a year ago about this and he confirmed it was intentional. The rationale described here is still relevant. The only solution at the current time is to remove the forward declaration and import the appropriate Swift header.