Skip to content

[SR-13032] Invalid .swiftinterface when textually including C struct in different modules #55477

Closed
@swift-ci

Description

@swift-ci
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:

  • SubModule is Glibc

  • ForeignA is SwiftOverlayShims

  • ForeignB is SwiftGlibc

  • The textual header is sys/time.h, and ForeignStruct is struct timeval

I believe this needs to be fixed in TypePrinter::printModuleContext(), but I'm not sure exactly how.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugA deviation from expected or documented behavior. Also: expected but undesirable behavior.c interopFeature: Interoperability with CcompilerThe Swift compiler itselfswift 5.3textual interfacesunexpected errorBug: Unexpected error

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions