|
| 1 | +// RUN: %target-swift-emit-ir %s -I %S/Inputs -enable-cxx-interop | %FileCheck %s |
| 2 | + |
| 3 | +import CanonicalTypes |
| 4 | + |
| 5 | +public func testCanonicalTypes() -> Bool { |
| 6 | + // multiple typedeffed types with the same canonical type are the same type |
| 7 | + // from the typechecking perspective. |
| 8 | + let magicNumber = MagicNumber() |
| 9 | + var wrappedMagicNumberA = WrappedMagicNumberA(t: magicNumber) |
| 10 | + |
| 11 | + var wrappedMagicNumberB: WrappedMagicNumberA = |
| 12 | + WrappedMagicNumberB(t: magicNumber) |
| 13 | + return wrappedMagicNumberA.callGetInt() == wrappedMagicNumberB.callGetInt() |
| 14 | +} |
| 15 | + |
| 16 | +// CHECK_NOT: __CxxTemplateInst |
| 17 | +// CHECK: define {{(protected |dllexport )?}}swiftcc i1 @"$s4main18testCanonicalTypesSbyF"() |
| 18 | +// CHECK: %wrappedMagicNumberA = alloca %TSo12MagicWrapperV, align 1 |
| 19 | +// CHECK: %wrappedMagicNumberB = alloca %TSo12MagicWrapperV, align 1 |
| 20 | +// CHECK: %wrappedMagicNumberA.t = getelementptr inbounds %TSo12MagicWrapperV, %TSo12MagicWrapperV* %wrappedMagicNumberA, i32 0, i32 0 |
| 21 | +// CHECK: %wrappedMagicNumberB.t = getelementptr inbounds %TSo12MagicWrapperV, %TSo12MagicWrapperV* %wrappedMagicNumberB, i32 0, i32 0 |
| 22 | +// CHECK: [[MAGIC_WRAPPER_A:%.*]] = bitcast %TSo12MagicWrapperV* %wrappedMagicNumberA to %struct.MagicWrapper* |
| 23 | +// CHECK: call i32 @{{_ZNK12MagicWrapperI11MagicNumberE10callGetIntEv|"\?callGetInt@\?\$MagicWrapper@UMagicNumber@@@@QEBAHXZ"}}(%struct.MagicWrapper* [[MAGIC_WRAPPER_A]]) |
| 24 | +// CHECK: [[MAGIC_WRAPPER_B:%.*]] = bitcast %TSo12MagicWrapperV* %wrappedMagicNumberB to %struct.MagicWrapper* |
| 25 | +// CHECK: call i32 @{{_ZNK12MagicWrapperI11MagicNumberE10callGetIntEv|"\?callGetInt@\?\$MagicWrapper@UMagicNumber@@@@QEBAHXZ"}}(%struct.MagicWrapper* [[MAGIC_WRAPPER_B]]) |
| 26 | + |
| 27 | +// CHECK: define weak_odr{{( dso_local)?}} i32 @{{_ZNK12MagicWrapperI11MagicNumberE10callGetIntEv|"\?callGetInt@\?\$MagicWrapper@UMagicNumber@@@@QEBAHXZ"}}(%struct.MagicWrapper* %this) |
| 28 | +// CHECK: %this.addr = alloca %struct.MagicWrapper*, align 8 |
| 29 | +// CHECK: store %struct.MagicWrapper* %this, %struct.MagicWrapper** %this.addr, align 8 |
| 30 | +// CHECK: %this1 = load %struct.MagicWrapper*, %struct.MagicWrapper** %this.addr, align 8 |
| 31 | +// CHECK: %t = getelementptr inbounds %struct.MagicWrapper, %struct.MagicWrapper* %this1, i32 0, i32 0 |
| 32 | +// CHECK: %call = call i32 @{{_ZNK11MagicNumber6getIntEv|"\?getInt@MagicNumber@@QEBAHXZ"}}(%struct.MagicNumber* %t) |
| 33 | +// CHECK: %add = add nsw i32 %call, 5 |
| 34 | +// CHECK: ret i32 %add |
| 35 | + |
| 36 | +// CHECK: define linkonce_odr{{( dso_local)?}} i32 @{{_ZNK11MagicNumber6getIntEv|"\?getInt@MagicNumber@@QEBAHXZ"}}(%struct.MagicNumber* %this) |
| 37 | +// CHECK: %this.addr = alloca %struct.MagicNumber*, align 8 |
| 38 | +// CHECK: store %struct.MagicNumber* %this, %struct.MagicNumber** %this.addr, align 8 |
| 39 | +// CHECK: %this1 = load %struct.MagicNumber*, %struct.MagicNumber** %this.addr, align 8 |
| 40 | +// CHECK: ret i32 24 |
| 41 | + |
0 commit comments