|
|
| Previous ID |
SR-13032 |
| Radar |
rdar://problem/64517049 |
| Original Reporter |
martinboehme (JIRA User) |
| Type |
Bug |
Additional Detail from JIRA
|
|
| Votes |
0 |
| Component/s |
Compiler |
| Labels |
Bug, ParseableInterfaces |
| Assignee |
None |
| Priority |
Medium |
md5: 13b4c87976347810d07df29fa015e2a2
Issue Description:
The following commit contains a failing test demonstrating the problem:
martinboehme@f431f1b
It generates a .swiftinterface for module MainModule, but this .swiftinterface then fails to compile with the error message:
MainModule.swiftinterface:6:46: error: cannot find type 'ForeignA' in scope
public func funcTakingForeignStruct(_ param: ForeignA.ForeignStruct)
^~~~~~~~
To summarize the situation:
- The Swift module
SubModule imports Clang modules ForeignA and ForeignB. Both ForeignA and ForeignB include a textual header containing the struct ForeignStruct.
- SubModule re-exports
ForeignB but not ForeignA. ForeignStruct is therefore available to clients of SubModule; those clients can use it either using the unqualified name ForeignStruct or the qualified name ForeignB.ForeignStruct, but not ForeignA.ForeignStruct (because SubModule doesn't re-export ForeignA).
- The Swift module
MainModule imports SubModule and uses ForeignStruct in the signature of funcTakingForeignStruct. When MainModule is compiled to a .swiftinterface file, that signature erroneously refers to ForeignStruct as ForeignA.ForeignStruct instead of ForeignB.ForeignStruct. Because of this, the resulting .swiftinterface file does not compile.
I discovered this issue in the course of investigating a CI failure on #32404. The repro above corresponds to the situation in the failing test as follows:
I believe this needs to be fixed in TypePrinter::printModuleContext(), but I'm not sure exactly how.
Additional Detail from JIRA
md5: 13b4c87976347810d07df29fa015e2a2
Issue Description:
The following commit contains a failing test demonstrating the problem:
martinboehme@f431f1b
It generates a
.swiftinterfacefor moduleMainModule, but this.swiftinterfacethen fails to compile with the error message:To summarize the situation:
SubModuleimports Clang modulesForeignAandForeignB. BothForeignAandForeignBinclude a textual header containing the structForeignStruct.ForeignBbut notForeignA.ForeignStructis therefore available to clients ofSubModule; those clients can use it either using the unqualified nameForeignStructor the qualified nameForeignB.ForeignStruct, but notForeignA.ForeignStruct(becauseSubModuledoesn't re-exportForeignA).MainModuleimportsSubModuleand usesForeignStructin the signature offuncTakingForeignStruct. WhenMainModuleis compiled to a.swiftinterfacefile, that signature erroneously refers toForeignStructasForeignA.ForeignStructinstead ofForeignB.ForeignStruct. Because of this, the resulting.swiftinterfacefile does not compile.I discovered this issue in the course of investigating a CI failure on #32404. The repro above corresponds to the situation in the failing test as follows:
SubModuleisGlibcForeignAisSwiftOverlayShimsForeignBisSwiftGlibcThe textual header is
sys/time.h, andForeignStructisstruct timevalI believe this needs to be fixed in
TypePrinter::printModuleContext(), but I'm not sure exactly how.