Files
swift-mirror/test/Interop/Cxx/foreign-reference/inheritance.swift
Gabor Horvath d254e83376 [cxx-interop] Fix not importing return type for certain functions
C++ namespaces are imported as enums. The importer triggered different
code path for functions in C++ namespaces and functions in the global
scope. As a result, we occasionally did not import the return type of
certain C++ functions in namespace scope.
2025-04-03 18:12:36 +01:00

165 lines
6.5 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// REQUIRES: executable_test
// RUN: %target-run-simple-swift(-cxx-interoperability-mode=default -Xfrontend -disable-availability-checking -I %S/Inputs)
// TODO: Fix this lit test failure on windows rdar://145218056
// XFAIL: OS=windows-msvc
import Inheritance
import StdlibUnittest
// A function whose explicit type annotations specializes the cxxCast function.
//
// In Swift, the generic type parameters of cxxCast I and O should be respectively instantiated to SubT and BaseT.
// However, since these are foreign reference types, this instantiates (and calls) cxxCast<SubT *, BaseT *> in C++.
func cast(_ s: SubT) -> BaseT {
return cxxCast(s)
}
var InheritanceTestSuite = TestSuite("Inheritance of foreign reference types")
InheritanceTestSuite.test("Templated cast to base") {
let s: SubT = SubT.getSubT()
expectFalse(s.isBase)
let sc: BaseT = cast(s)
expectFalse(sc.isBase)
let sx: BaseT = cxxCast(s) // should instantiate I to SubT and O to BaseT
expectFalse(sx.isBase)
let sy: BaseT = Foo.cxxCast(s) // should instantiate I to SubT and O to BaseT
expectFalse(sy.isBase)
}
InheritanceTestSuite.test("Templated cast to itself") {
let b: BaseT = BaseT.getBaseT()
expectTrue(b.isBase)
let bc: BaseT = cxxCast(b) // should instantiate I and O both to BaseT
expectTrue(bc.isBase)
}
InheritanceTestSuite.test("DerivedOutOfOrder") {
let d = DerivedOutOfOrder.getInstance()
expectEqual(123, d.baseField)
expectEqual(456, d.derivedField)
expectEqual(789, d.leafField)
}
InheritanceTestSuite.test("DerivedUsesBaseTailPadding") {
let d = DerivedUsesBaseTailPadding.getInstance()
expectEqual(123, d.field8)
expectEqual(456, d.field4)
expectEqual(789, d.field2)
}
InheritanceTestSuite.test("ParentChild") {
let immortalRefType = ImmortalRefereceExample.returnImmortalRefType()
expectTrue(
type(of: immortalRefType) is AnyObject.Type,
"Expected immortalRefType to be a reference type, but its a value type")
let derivedFromImmortalRefType = ImmortalRefereceExample.returnDerivedFromImmortalRefType()
expectTrue(
type(of: derivedFromImmortalRefType) is AnyObject.Type,
"Expected derivedFromImmortalRefType to be a value type, but its a reference type")
let valType = ExplicitAnnotationHasPrecedence1.returnValueType()
expectTrue(
!(type(of: valType) is AnyObject.Type),
"Expected valType to be a value type, but its a reference type")
let referenceType = ExplicitAnnotationHasPrecedence1.returnRefType()
expectTrue(
type(of: referenceType) is AnyObject.Type,
"Expected referenceType to be a reference type, but its a value type")
let derivedFromValType = ExplicitAnnotationHasPrecedence1.returnDerivedFromValueType()
expectTrue(
!(type(of: derivedFromValType) is AnyObject.Type),
"Expected derivedFromValType to be a value type, but its a reference type")
let derivedFromRefTypeAAndB = ExplicitAnnotationHasPrecedence2.returnDerivedFromRefTypeAAndB()
expectTrue(
!(type(of: derivedFromRefTypeAAndB) is AnyObject.Type),
"Expected derivedFromRefTypeAAndB to be a value type, but its a reference type")
let derivedFromRefTypeAAndBAnnotated =
ExplicitAnnotationHasPrecedence2.returnDerivedFromRefTypeAAndBAnnotated()
expectTrue(
type(of: derivedFromRefTypeAAndBAnnotated) is AnyObject.Type,
"Expected derivedFromRefTypeAAndBAnnotated to be a reference type, but its a value type")
let derivedFromValueTypeAndAnnotated =
ExplicitAnnotationHasPrecedence1.returnDerivedFromValueTypeAndAnnotated()
expectTrue(
type(of: derivedFromValueTypeAndAnnotated) is AnyObject.Type,
"Expected derivedFromValueTypeAndAnnotated to be a reference type, but its a value type")
let derivedFromReferenceType = ExplicitAnnotationHasPrecedence1.returnDerivedFromRefType()
expectTrue(
type(of: derivedFromReferenceType) is AnyObject.Type,
"Expected derivedFromReferenceType to be a reference type, but its a value type")
let derivedFromReferenceTypeAndAnnotated =
ExplicitAnnotationHasPrecedence1.returnDerivedFromRefTypeAndAnnotated()
expectTrue(
type(of: derivedFromReferenceTypeAndAnnotated) is AnyObject.Type,
"Expected derivedFromReferenceTypeAndAnnotated to be a reference type, but its a value type"
)
let valueType = BasicInheritanceExample.returnValueType()
expectTrue(
!(type(of: valueType) is AnyObject.Type),
"Expected valueType to be a value type, but its a reference type")
let refType = BasicInheritanceExample.returnRefType()
expectTrue(
type(of: refType) is AnyObject.Type,
"Expected refType to be a reference type, but its a value type")
let derivedFromRefType = BasicInheritanceExample.returnDerivedFromRefType()
expectTrue(
type(of: derivedFromRefType) is AnyObject.Type,
"Expected derivedFromRefType to be a reference type, but its a value type")
let derivedFromBaseRef1AndBaseRef2 =
MultipleInheritanceExample1.returnDerivedFromBaseRef1AndBaseRef2()
expectTrue(
!(type(of: derivedFromBaseRef1AndBaseRef2) is AnyObject.Type),
"Expected derivedFromBaseRef1AndBaseRef2 to be a value type, but its a reference type")
let derivedFromBaseRef3 = MultipleInheritanceExample1.returnDerivedFromBaseRef3()
expectTrue(
type(of: derivedFromBaseRef3) is AnyObject.Type,
"Expected derivedFromBaseRef3 to be a reference type, but its a value type")
let d2 = MultipleInheritanceExample2.returnD()
expectTrue(
!(type(of: d2) is AnyObject.Type),
"Expected d2 to be a value type, but its a reference type")
let d3 = MultipleInheritanceExample2.returnD()
expectTrue(
!(type(of: d3) is AnyObject.Type),
"Expected d3 to be a value type, but its a reference type")
let refTypeDiamond = RefTypeDiamondInheritance.returnDiamond()
expectTrue(
!(type(of: refTypeDiamond) is AnyObject.Type),
"Expected refTypeDiamond to be a value type, but its a reference type")
let virtualDiamond = RefTypeDiamondInheritance.returnVirtualDiamond()
expectTrue(
type(of: virtualDiamond) is AnyObject.Type,
"Expected virtualDiamond to be a reference type, but its a value type")
let nonRefTypeDiamond = NonRefTypeDiamondInheritance.returnDiamond()
expectTrue(
type(of: nonRefTypeDiamond) is AnyObject.Type,
"Expected nonRefTypeDiamond to be a reference type, but its a value type")
let forest = InheritingTemplatedRefType.returnForest()
expectTrue(
type(of: forest) is AnyObject.Type,
"Expected forest to be a reference type, but its a value type")
}
runAllTests()