swiftlang / swift

The Swift Programming Language
https://swift.org
Apache License 2.0
67.37k stars 10.34k forks source link

[cxx-interop] Wrong class order in Swift generated header #68209

Open CrazySage opened 1 year ago

CrazySage commented 1 year ago

Description I declare in my Swift module two entities - swift class and function, that returns instance of that class. In Swift header they are in wrong order, so C++ function doesn't compile with "incomplete return type" error

Steps to reproduce Swift code:

import Foundation

public class SwiftSideInterfaceBridge
{
    public func Callback() -> String
    {
        return "Some string"
    }
}

public func GetSwiftInterface() -> SwiftSideInterfaceBridge
{
    return SwiftSideInterfaceBridge()
}

Generated Fibonacci-Swift.h file

SWIFT_INLINE_THUNK SwiftSideInterfaceBridge GetSwiftInterface() noexcept SWIFT_SYMBOL("s:9Fibonacci17GetSwiftInterfaceAA0c4SideD6BridgeCyF") SWIFT_WARN_UNUSED_RESULT {
  return _impl::_impl_SwiftSideInterfaceBridge::makeRetained(_impl::$s9Fibonacci17GetSwiftInterfaceAA0c4SideD6BridgeCyF());
}

class SWIFT_SYMBOL("s:9Fibonacci24SwiftSideInterfaceBridgeC") SwiftSideInterfaceBridge;

Error log: /Users/ga.igumnov/Library/Developer/Xcode/DerivedData/Swift-and-Cplusplus-mixed-FibonacciFramework-eugjhlmqeyxtxedokyptdvqagwbn/Build/Products/Debug/Fibonacci.framework/Headers/Fibonacci-Swift.h:5279:20 Unknown type name 'SwiftSideInterfaceBridge'

/Users/ga.igumnov/Library/Developer/Xcode/DerivedData/Swift-and-Cplusplus-mixed-FibonacciFramework-eugjhlmqeyxtxedokyptdvqagwbn/Build/Products/Debug/Fibonacci.framework/Headers/Fibonacci-Swift.h:5279:45 incomplete result type 'SwiftSideInterfaceBridge' in function definition

/Users/ga.igumnov/Library/Developer/Xcode/DerivedData/Swift-and-Cplusplus-mixed-FibonacciFramework-eugjhlmqeyxtxedokyptdvqagwbn/Build/Products/Debug/Fibonacci.framework/Headers/Fibonacci-Swift.h:5280:10 no member named '_impl_SwiftSideInterfaceBridge' in namespace 'Fibonacci::_impl'; did you mean 'SwiftSideInterfaceBridge'?

/Users/ga.igumnov/Library/Developer/Xcode/DerivedData/Swift-and-Cplusplus-mixed-FibonacciFramework-eugjhlmqeyxtxedokyptdvqagwbn/Build/Products/Debug/Fibonacci.framework/Headers/Fibonacci-Swift.h:5280:17 No member named '_impl_SwiftSideInterfaceBridge' in namespace 'Fibonacci::_impl'

/Users/ga.igumnov/Library/Developer/Xcode/DerivedData/Swift-and-Cplusplus-mixed-FibonacciFramework-eugjhlmqeyxtxedokyptdvqagwbn/Build/Products/Debug/Fibonacci.framework/Headers/Fibonacci-Swift.h:5280:17 incomplete type 'Fibonacci::SwiftSideInterfaceBridge' named in nested name specifier

Expected behavior Entities in Fibonacci-Swift.h should be in reverse order

Environment Swift 5.9, XCode 15 Beta

InteropTest.zip Fibonacci-Swift.h.zip

kadu-v commented 10 months ago

I'm facing the same issue...

dyp commented 7 months ago

The same problem. Classes are output in sorted order. It is necessary to make forward decls to avoid unresolved errors.