blob: bc0c9c8ae75c8ded8f3392697cfb9f465626debb [file] [log] [blame]
// RUN: %target-swift-frontend -emit-ir -parse-stdlib %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-endian
// CHECK: @"$s36access_type_metadata_by_mangled_name3FooCyAA3BarCyAA3ZimCyAA4ZangCGGGMD" = linkonce_odr hidden global { i32, i32 }
// CHECK-little-SAME: @"symbolic{{.*}}36access_type_metadata_by_mangled_name3FooC{{.*}}AA3BarC{{.*}}AA3ZimC{{.*}}AA4ZangC{{.*}}"
// CHECK-little-SAME: i32 -{{[0-9]+}}
// CHECK-big-SAME: i32 -{{[0-9]+}}
// CHECK-big-SAME: @"symbolic{{.*}}36access_type_metadata_by_mangled_name3FooC{{.*}}AA3BarC{{.*}}AA3ZimCyAA4ZangC{{.*}}"
// CHECK-SAME: align 8
class Foo<T> {
class NestedNonGeneric {}
class NestedGeneric<U> {}
}
class Bar<T> { }
class Zim<T> {}
class Zang {
class NestedNonGeneric {}
class NestedGeneric<U> {}
}
extension Zim where T == Zang {
class ExtensionNonGeneric {}
class ExtensionGeneric<U> {}
}
precedencegroup AssignmentPrecedence {}
protocol Proto {}
// CHECK-LABEL: define {{.*}} @"$s36access_type_metadata_by_mangled_name4testyXlyF"()
public func test() -> Builtin.AnyObject {
var x: Builtin.AnyObject
// CHECK: call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s36access_type_metadata_by_mangled_name3FooCyAA3BarCyAA3ZimCyAA4ZangCGGGMD")
x = Foo<Bar<Zim<Zang>>>()
// CHECK: call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s36access_type_metadata_by_mangled_name3FooC16NestedNonGenericCyAA4ZangC_GMD")
x = Foo<Zang>.NestedNonGeneric()
// CHECK: call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s36access_type_metadata_by_mangled_name3FooC13NestedGenericCyAA4ZangC_AGGMD")
x = Foo<Zang>.NestedGeneric<Zang>()
// CHECK: call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s36access_type_metadata_by_mangled_name4ZangC13NestedGenericCy_ACGMD")
x = Zang.NestedGeneric<Zang>()
// CHECK: call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s36access_type_metadata_by_mangled_name3ZimCA2A4ZangCRszlE16ExtensionGenericCyAE_AEGMD")
x = Zim<Zang>.ExtensionGeneric<Zang>()
// Accessing nongeneric nominal type metadata should still go through the
// accessor, which generally has to exist anyway. Using a mangled name would
// only add code size.
// CHECK: call swiftcc %swift.metadata_response @"$s36access_type_metadata_by_mangled_name4ZangCMa"
x = Zang()
// CHECK: call swiftcc %swift.metadata_response @"$s36access_type_metadata_by_mangled_name4ZangC16NestedNonGenericCMa"
x = Zang.NestedNonGeneric()
// CHECK: call swiftcc %swift.metadata_response @"$s36access_type_metadata_by_mangled_name3ZimCA2A4ZangCRszlE19ExtensionNonGenericCyAE_GMa"
x = Zim<Zang>.ExtensionNonGeneric()
// Protocols still have only existential type metadata, so it's better
// to access them by mangled name.
// CHECK: call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s36access_type_metadata_by_mangled_name5Proto_pMD")
var y: Any.Type = Proto.self
return x
}