mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
When Swift imports C structs, it synthesizes an initializer that takes no arguments and zero-initializes the C struct. When C++ interop is enabled, Clang treats all C structs as if they were C++ structs. This means that some of the C structs will get a default constructor implicitly generated by Clang. This implicit default constructor will not zero-initialize trivial fields of the struct. This is a common source of confusion and subtle bugs for developers who try to enable C++ interop in existing projects that use C interop and rely on zero-initialization of C structs. rdar://115909532
93 lines
2.0 KiB
C++
93 lines
2.0 KiB
C++
#ifndef TEST_INTEROP_CXX_CLASS_INPUTS_CONSTRUCTORS_H
|
|
#define TEST_INTEROP_CXX_CLASS_INPUTS_CONSTRUCTORS_H
|
|
|
|
struct ExplicitDefaultConstructor {
|
|
ExplicitDefaultConstructor() : x(42) {}
|
|
int x;
|
|
};
|
|
|
|
struct ImplicitDefaultConstructor {
|
|
int x = 42;
|
|
};
|
|
|
|
struct DefaultedDefaultConstructor {
|
|
int x = 42;
|
|
DefaultedDefaultConstructor() = default;
|
|
};
|
|
|
|
struct MemberOfClassType {
|
|
ImplicitDefaultConstructor member;
|
|
};
|
|
|
|
struct DefaultConstructorDeleted {
|
|
DefaultConstructorDeleted() = delete;
|
|
int &a;
|
|
};
|
|
|
|
struct ConstructorWithParam {
|
|
ConstructorWithParam(int val) : x(val + 42) {}
|
|
int x;
|
|
};
|
|
|
|
struct CopyAndMoveConstructor {
|
|
CopyAndMoveConstructor(const CopyAndMoveConstructor &) = default;
|
|
CopyAndMoveConstructor(CopyAndMoveConstructor &&) = default;
|
|
|
|
int value = 123;
|
|
int *ptr = nullptr;
|
|
};
|
|
|
|
struct Base {};
|
|
|
|
struct ArgType {
|
|
int i = 42;
|
|
};
|
|
|
|
struct HasVirtualBase : public virtual Base {
|
|
HasVirtualBase() = delete;
|
|
HasVirtualBase(ArgType Arg) {}
|
|
int i;
|
|
};
|
|
|
|
struct EmptyStruct {};
|
|
|
|
struct IntWrapper {
|
|
int x;
|
|
};
|
|
|
|
struct TemplatedConstructor {
|
|
ArgType value;
|
|
|
|
template<class T>
|
|
TemplatedConstructor(T value) : value(value) { }
|
|
};
|
|
|
|
struct TemplatedConstructorWithExtraArg {
|
|
template<class T>
|
|
TemplatedConstructorWithExtraArg(int, T value) { }
|
|
template<class T>
|
|
TemplatedConstructorWithExtraArg(T value, int) { }
|
|
template<class T, class U>
|
|
TemplatedConstructorWithExtraArg(T value, U other) { }
|
|
};
|
|
|
|
struct __attribute__((swift_attr("import_unsafe")))
|
|
HasUserProvidedCopyConstructor {
|
|
int numCopies;
|
|
HasUserProvidedCopyConstructor(int numCopies = 0) : numCopies(numCopies) {}
|
|
HasUserProvidedCopyConstructor(const HasUserProvidedCopyConstructor &other)
|
|
: numCopies(other.numCopies + 1) {}
|
|
};
|
|
|
|
struct DeletedCopyConstructor {
|
|
DeletedCopyConstructor(const DeletedCopyConstructor &) = delete;
|
|
};
|
|
|
|
#ifdef ENABLE_PTRAUTH
|
|
struct HasPtrAuthMember {
|
|
void (*__ptrauth(1, 1, 3) handler)();
|
|
};
|
|
#endif
|
|
|
|
#endif // TEST_INTEROP_CXX_CLASS_INPUTS_CONSTRUCTORS_H
|