Skip to content

Commit 36024b6

Browse files
authored
Merge pull request #24804 from brentdax/erroneously-mangled-error-manglings
[ASTMangler] Mangle nested imported error structs correctly
2 parents 60cd149 + affcefc commit 36024b6

File tree

7 files changed

+72
-5
lines changed

7 files changed

+72
-5
lines changed

lib/AST/ASTDemangler.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ Type ASTBuilder::createNominalType(GenericTypeDecl *decl, Type parent) {
155155
// Imported types can be renamed to be members of other (non-generic)
156156
// types, but the mangling does not have a parent type. Just use the
157157
// declared type directly in this case and skip the parent check below.
158-
if (nominalDecl->hasClangNode() && !nominalDecl->isGenericContext())
158+
bool isImported = nominalDecl->hasClangNode() ||
159+
nominalDecl->getAttrs().hasAttribute<ClangImporterSynthesizedTypeAttr>();
160+
if (isImported && !nominalDecl->isGenericContext())
159161
return nominalDecl->getDeclaredType();
160162

161163
// Validate the parent type.
@@ -177,7 +179,9 @@ Type ASTBuilder::createTypeAliasType(GenericTypeDecl *decl, Type parent) {
177179
// Imported types can be renamed to be members of other (non-generic)
178180
// types, but the mangling does not have a parent type. Just use the
179181
// declared type directly in this case and skip the parent check below.
180-
if (aliasDecl->hasClangNode() && !aliasDecl->isGenericContext())
182+
bool isImported = aliasDecl->hasClangNode() ||
183+
aliasDecl->getAttrs().hasAttribute<ClangImporterSynthesizedTypeAttr>();
184+
if (isImported && !aliasDecl->isGenericContext())
181185
return aliasDecl->getDeclaredInterfaceType();
182186

183187
// Validate the parent type.

lib/AST/ASTMangler.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,6 +1493,12 @@ ASTMangler::getSpecialManglingContext(const ValueDecl *decl,
14931493
}
14941494
}
14951495

1496+
// Importer-synthesized types should always be mangled in the
1497+
// ClangImporterContext, even if an __attribute__((swift_name())) nests them
1498+
// inside a Swift type syntactically.
1499+
if (decl->getAttrs().hasAttribute<ClangImporterSynthesizedTypeAttr>())
1500+
return ASTMangler::ClangImporterContext;
1501+
14961502
return None;
14971503
}
14981504

test/IRGen/Inputs/error_domains.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,15 @@ extern NSString *TypedefDomain2;
2323
typedef enum __attribute__((ns_error_domain(TypedefDomain2))) {
2424
Illness
2525
} TypedefError2;
26+
27+
@interface Nested @end
28+
29+
extern NSString * const NestedTagDomain;
30+
typedef MY_ERROR_ENUM(int, NestedTagError, NestedTagDomain) {
31+
Trappedness
32+
} __attribute__((swift_name("Nested.TagError")));
33+
34+
extern NSString *NestedTypedefDomain;
35+
typedef enum __attribute__((ns_error_domain(NestedTypedefDomain))) {
36+
Brokenness
37+
} NestedTypedefError __attribute__((swift_name("Nested.TypedefError")));

test/IRGen/related_entity.sil

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ sil @use_metatypes : $@convention(thin) () -> () {
1313
bb0:
1414
%take = function_ref @take_metatype : $@convention(thin) <T> (@thick T.Type) -> ()
1515

16+
// CHECK: [[NestedTypedefErrorCode_NAME:@[0-9]+]] = private constant [29 x i8] c"Code\00NNestedTypedefError\00St\00\00"
17+
// CHECK: @"$sSo18NestedTypedefErroraMn" = linkonce_odr hidden constant
18+
// CHECK-SAME: <i32 0x0006_0012>
19+
// CHECK-SAME: @"$sSoMXM"
20+
// CHECK-SAME: [29 x i8]* [[NestedTypedefErrorCode_NAME]]
21+
22+
// CHECK: [[NestedTagError_NAME:@[0-9]+]] = private constant [29 x i8] c"TagError\00NNestedTagError\00Re\00\00"
23+
// CHECK: @"$sSC14NestedTagErrorLeVMn" = linkonce_odr hidden constant
24+
// CHECK-SAME: <i32 0x0006_0011>
25+
// CHECK-SAME: @"$sSCMXM"
26+
// CHECK-SAME: [29 x i8]* [[NestedTagError_NAME]]
27+
1628
// CHECK: [[TypedefError2Code_NAME:@[0-9]+]] = private constant [24 x i8] c"Code\00NTypedefError2\00St\00\00"
1729
// CHECK: @"$sSo13TypedefError2aMn" = linkonce_odr hidden constant
1830
// CHECK-SAME: <i32 0x0006_0012>
@@ -49,6 +61,12 @@ bb0:
4961
%3 = metatype $@thick TypedefError2.Code.Type
5062
apply %take<TypedefError2.Code>(%3) : $@convention(thin) <T> (@thick T.Type) -> ()
5163

64+
%4 = metatype $@thick Nested.TagError.Type
65+
apply %take<Nested.TagError>(%4) : $@convention(thin) <T> (@thick T.Type) -> ()
66+
67+
%5 = metatype $@thick Nested.TypedefError.Code.Type
68+
apply %take<Nested.TypedefError.Code>(%5) : $@convention(thin) <T> (@thick T.Type) -> ()
69+
5270
%ret = tuple ()
5371
return %ret : $()
5472
}

test/Inputs/custom-modules/ErrorEnums.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@ struct Wrapper {
1717
int unrelatedValue;
1818
};
1919

20-
// Not actually an error enum, since those can't be import-as-member'd right
21-
// now, but it can still hang with us.
20+
NSString * const MyMemberErrorDomain;
21+
typedef NS_ENUM(int, MyMemberError) {
22+
MyMemberErrorA,
23+
MyMemberErrorB,
24+
} __attribute__((ns_error_domain(MyMemberErrorDomain))) __attribute__((swift_name("Wrapper.MemberError")));
25+
26+
// Not actually an error enum, but it can still hang with us.
2227
typedef NS_ENUM(int, MyMemberEnum) {
2328
MyMemberEnumA,
2429
MyMemberEnumB,

test/RemoteAST/foreign_types.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,16 @@ printType(RenamedError.self)
2828
printType(RenamedError.Code.self)
2929
// CHECK: found type: RenamedError.Code{{$}}
3030

31+
printType(Wrapper.MemberError.self)
32+
// CHECK: found type: Wrapper.MemberError{{$}}
33+
34+
printType(Wrapper.MemberError.Code.self)
35+
// CHECK: found type: Wrapper.MemberError.Code{{$}}
36+
3137
printType(Wrapper.MemberEnum.self)
3238
// CHECK: found type: Wrapper.MemberEnum{{$}}
3339

3440
printType(WrapperByAttribute.self)
3541
// CHECK: found type: WrapperByAttribute{{$}}
3642

37-
stopRemoteAST()
43+
stopRemoteAST()

test/TypeDecoder/foreign_types.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ do {
2626
let x3 = MyError.Code.good
2727
let x4 = RenamedError.good
2828
let x5 = RenamedError.Code.good
29+
let x5b = Wrapper.MemberError.A
30+
let x5c = Wrapper.MemberError.Code.A
2931
let x6 = Wrapper.MemberEnum.A
3032
let x7 = WrapperByAttribute(0)
3133
let x8 = IceCube(width: 0, height: 0, depth: 0)
@@ -38,6 +40,8 @@ do {
3840
let x3 = MyError.Code.self
3941
let x4 = RenamedError.self
4042
let x5 = RenamedError.Code.self
43+
let x5b = Wrapper.MemberError.self
44+
let x5c = Wrapper.MemberError.Code.self
4145
let x6 = Wrapper.MemberEnum.self
4246
let x7 = WrapperByAttribute.self
4347
let x8 = IceCube.self
@@ -50,6 +54,8 @@ do {
5054
// DEMANGLE-TYPE: $sSo7MyErrorLeVD
5155
// DEMANGLE-TYPE: $sSo14MyRenamedErrorVD
5256
// DEMANGLE-TYPE: $sSo14MyRenamedErrorLeVD
57+
// DEMANGLE-TYPE: $sSo13MyMemberErrorVD
58+
// DEMANGLE-TYPE: $sSo13MyMemberErrorLeVD
5359
// DEMANGLE-TYPE: $sSo12MyMemberEnumVD
5460
// DEMANGLE-TYPE: $sSo18WrapperByAttributeaD
5561
// DEMANGLE-TYPE: $sSo7IceCubeVD
@@ -62,6 +68,8 @@ do {
6268
// CHECK-TYPE: MyError
6369
// CHECK-TYPE: RenamedError.Code
6470
// CHECK-TYPE: RenamedError
71+
// CHECK-TYPE: Wrapper.MemberError.Code
72+
// CHECK-TYPE: Wrapper.MemberError
6573
// CHECK-TYPE: Wrapper.MemberEnum
6674
// CHECK-TYPE: WrapperByAttribute
6775
// CHECK-TYPE: IceCube
@@ -74,6 +82,8 @@ do {
7482
// DEMANGLE-TYPE: $sSC7MyErrorLeVmD
7583
// DEMANGLE-TYPE: $sSo14MyRenamedErrorVmD
7684
// DEMANGLE-TYPE: $sSC14MyRenamedErrorLeVmD
85+
// DEMANGLE-TYPE: $sSo13MyMemberErrorVmD
86+
// DEMANGLE-TYPE: $sSC13MyMemberErrorLeVmD
7787
// DEMANGLE-TYPE: $sSo12MyMemberEnumVmD
7888
// DEMANGLE-TYPE: $sSo18WrapperByAttributeamD
7989
// DEMANGLE-TYPE: $sSo7IceCubeVmD
@@ -86,6 +96,8 @@ do {
8696
// CHECK-TYPE: MyError.Type
8797
// CHECK-TYPE: RenamedError.Code.Type
8898
// CHECK-TYPE: RenamedError.Type
99+
// CHECK-TYPE: Wrapper.MemberError.Code.Type
100+
// CHECK-TYPE: Wrapper.MemberError.Type
89101
// CHECK-TYPE: Wrapper.MemberEnum.Type
90102
// CHECK-TYPE: WrapperByAttribute.Type
91103
// CHECK-TYPE: IceCube.Type
@@ -98,6 +110,8 @@ do {
98110
// DEMANGLE-DECL: $sSo7MyErrorLeV
99111
// DEMANGLE-DECL: $sSo14MyRenamedErrorV
100112
// DEMANGLE-DECL: $sSo14MyRenamedErrorLeV
113+
// DEMANGLE-DECL: $sSo13MyMemberErrorV
114+
// DEMANGLE-DECL: $sSo13MyMemberErrorLeV
101115
// DEMANGLE-DECL: $sSo12MyMemberEnumV
102116
// DEMANGLE-DECL: $sSo18WrapperByAttributea
103117
// DEMANGLE-DECL: $sSo7IceCubeV
@@ -110,6 +124,8 @@ do {
110124
// CHECK-DECL: ErrorEnums.(file).MyError.Code
111125
// CHECK-DECL: ErrorEnums.(file).RenamedError.Code
112126
// CHECK-DECL: ErrorEnums.(file).RenamedError.Code
127+
// CHECK-DECL: ErrorEnums.(file).Wrapper extension.MemberError.Code
128+
// CHECK-DECL: ErrorEnums.(file).Wrapper extension.MemberError.Code
113129
// CHECK-DECL: ErrorEnums.(file).Wrapper extension.MemberEnum
114130
// CHECK-DECL: ErrorEnums.(file).WrapperByAttribute
115131
// CHECK-DECL: CoreCooling.(file).IceCube

0 commit comments

Comments
 (0)