Skip to content

Commit 5a2c20a

Browse files
authored
Merge pull request #31657 from MForster/m/memberwise-initializer
Synthesize memberwise initializers despite member functions
2 parents af77ec6 + 2842748 commit 5a2c20a

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3348,8 +3348,8 @@ namespace {
33483348

33493349
auto member = Impl.importDecl(nd, getActiveSwiftVersion());
33503350
if (!member) {
3351-
if (!isa<clang::TypeDecl>(nd)) {
3352-
// We don't know what this field is.
3351+
if (!isa<clang::TypeDecl>(nd) && !isa<clang::FunctionDecl>(nd)) {
3352+
// We don't know what this member is.
33533353
// Assume it may be important in C.
33543354
hasUnreferenceableStorage = true;
33553355
hasMemberwiseInitializer = false;

test/Interop/Cxx/class/Inputs/memberwise-initializer.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ struct StructPublicAndPrivate {
2121
int varPrivate;
2222
};
2323

24+
struct StructWithUnimportedMemberFunction {
25+
int varPublic;
26+
int StructWithUnimportedMemberFunction::* unimportedMemberFunction();
27+
};
28+
2429
class ClassPrivateOnly {
2530
int varPrivate;
2631
};
@@ -41,4 +46,10 @@ class ClassPrivateAndPublic {
4146
int varPublic;
4247
};
4348

49+
struct ClassWithUnimportedMemberFunction {
50+
public:
51+
int varPublic;
52+
int ClassWithUnimportedMemberFunction::* unimportedMemberFunction();
53+
};
54+
4455
#endif

test/Interop/Cxx/class/memberwise-initializer-module-interface.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
// CHECK-NEXT: var varPublic: Int32
1818
// CHECK-NEXT: init()
1919
// CHECK-NEXT: }
20+
// CHECK-NEXT: struct StructWithUnimportedMemberFunction {
21+
// CHECK-NEXT: var varPublic: Int32
22+
// CHECK-NEXT: init()
23+
// CHECK-NEXT: init(varPublic: Int32)
24+
// CHECK-NEXT: }
2025
// CHECK-NEXT: struct ClassPrivateOnly {
2126
// CHECK-NEXT: init()
2227
// CHECK-NEXT: }
@@ -32,3 +37,8 @@
3237
// CHECK-NEXT: var varPublic: Int32
3338
// CHECK-NEXT: init()
3439
// CHECK-NEXT: }
40+
// CHECK-NEXT: struct ClassWithUnimportedMemberFunction {
41+
// CHECK-NEXT: var varPublic: Int32
42+
// CHECK-NEXT: init()
43+
// CHECK-NEXT: init(varPublic: Int32)
44+
// CHECK-NEXT: }

test/Interop/Cxx/class/memberwise-initializer-typechecker.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ let structPublicOnly = StructPublicOnly(varPublic: 42)
77
let structEmptyPrivateSetion = StructEmptyPrivateSection(varPublic: 42)
88
let structPublicAndPrivate1 = StructPublicAndPrivate(varPublic: 42) // expected-error {{argument passed to call that takes no arguments}}
99
let structPublicAndPrivate2 = StructPublicAndPrivate(varPublic: 42, varPrivate: 23) // expected-error {{argument passed to call that takes no arguments}}
10+
let structWithUnimportedMemberFunction = StructWithUnimportedMemberFunction(varPublic: 42)
1011

1112
let classPrivateOnly = ClassPrivateOnly(varPrivate: 42) // expected-error {{argument passed to call that takes no arguments}}
1213
let classPublicOnly = ClassPublicOnly(varPublic: 42)
1314
let classEmptyPublicSetion = ClassEmptyPublicSection(varPrivate: 42) // expected-error {{argument passed to call that takes no arguments}}
1415
let classPublicAndPrivate1 = ClassPrivateAndPublic(varPublic: 23) // expected-error {{argument passed to call that takes no arguments}}
1516
let classPublicAndPrivate2 = ClassPrivateAndPublic(varPrivate: 42, varPublic: 23) // expected-error {{argument passed to call that takes no arguments}}
17+
let classWithUnimportedMemberFunction = ClassWithUnimportedMemberFunction(varPublic: 42)

0 commit comments

Comments
 (0)