mirror of https://github.com/mono/CppSharp.git
c-sharpdotnetmonobindingsbridgecclangcpluspluscppsharpglueinteropparserparsingpinvokeswigsyntax-treevisitorsxamarinxamarin-bindings
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1561 lines
31 KiB
1561 lines
31 KiB
#include "../Tests.h" |
|
#include "AnotherUnit.h" |
|
|
|
#ifdef _WIN32 |
|
#include <vadefs.h> |
|
#endif |
|
#include <string> |
|
#include <vector> |
|
#include <memory> |
|
|
|
class DLL_API TestPacking |
|
{ |
|
public: |
|
int i1; |
|
int i2; |
|
bool b; |
|
}; |
|
|
|
#pragma pack(1) |
|
class DLL_API TestPacking1: public TestPacking |
|
{ |
|
}; |
|
|
|
#pragma pack(2) |
|
class DLL_API TestPacking2: public TestPacking |
|
{ |
|
}; |
|
|
|
#pragma pack(4) |
|
class DLL_API TestPacking4: public TestPacking |
|
{ |
|
}; |
|
|
|
#pragma pack(8) |
|
class DLL_API TestPacking8: public TestPacking |
|
{ |
|
}; |
|
#pragma pack() |
|
|
|
class DLL_API IgnoredType |
|
{ |
|
class IgnoredNested |
|
{ |
|
private: |
|
int i; |
|
}; |
|
private: |
|
int i; |
|
}; |
|
|
|
class DLL_API Foo |
|
{ |
|
private: |
|
enum Private |
|
{ |
|
Value1, |
|
Value2 |
|
}; |
|
public: |
|
enum |
|
{ |
|
EmptyEnum1, |
|
EmptyEnum2 |
|
}; |
|
|
|
class DLL_API NestedAbstract |
|
{ |
|
public: |
|
virtual ~NestedAbstract(); |
|
virtual int* abstractFunctionInNestedClass() = 0; |
|
}; |
|
|
|
Foo(); |
|
Foo(const Foo& other); |
|
Foo(Private p); |
|
Foo(const float& f); |
|
int A; |
|
float B; |
|
int Init = 20; |
|
IgnoredType ignoredType; |
|
int fixedArray[3]; |
|
char fixedCharArray[3]; |
|
void* ptr; |
|
static const int unsafe; |
|
static const char charArray[]; |
|
static int readWrite; |
|
|
|
const char* GetANSI(); |
|
|
|
// Not properly handled yet - ignore |
|
float nested_array[2][2]; |
|
// Primitive pointer types |
|
const int* SomePointer; |
|
const int** SomePointerPointer; |
|
|
|
typedef Foo* FooPtr; |
|
|
|
typedef uint8_t* typedefPrimitivePointer; |
|
typedefPrimitivePointer fieldOfTypedefPrimitivePointer; |
|
|
|
void TakesTypedefedPtr(FooPtr date); |
|
int TakesRef(const Foo& other); |
|
|
|
bool operator ==(const Foo& other) const; |
|
|
|
int fooPtr(); |
|
char16_t returnChar16(); |
|
|
|
static Foo staticField; |
|
}; |
|
|
|
struct DLL_API Bar |
|
{ |
|
enum Item |
|
{ |
|
Item1, |
|
Item2 |
|
}; |
|
|
|
Bar(); |
|
explicit Bar(const Foo* foo); |
|
Bar(Foo foo); |
|
Item RetItem1() const; |
|
int A; |
|
float B; |
|
Item fixedEnumArray[3]; |
|
|
|
Bar* returnPointerToValueType(); |
|
|
|
bool operator ==(const Bar& arg1) const; |
|
}; |
|
|
|
DLL_API bool operator ==(Bar::Item item, const Bar& bar); |
|
|
|
class DLL_API Foo2 : public Foo |
|
{ |
|
struct Copy { |
|
Foo A; |
|
}* copy; |
|
|
|
public: |
|
|
|
Foo2(); |
|
Foo2(const Foo2& other); |
|
|
|
int C; |
|
|
|
Foo2 operator<<(signed int i); |
|
Foo2 operator<<(signed long l); |
|
Bar valueTypeField; |
|
char testCharMarshalling(char c); |
|
void testKeywordParam(void* where, Bar::Item event, int ref); |
|
}; |
|
|
|
DLL_API Bar::Item operator |(Bar::Item left, Bar::Item right); |
|
|
|
struct DLL_API Bar2 : public Bar |
|
{ |
|
// Conversion operators |
|
|
|
struct DLL_API Nested |
|
{ |
|
operator int() const; |
|
}; |
|
|
|
operator int() const; |
|
operator Foo2(); |
|
Foo2 needFixedInstance() const; |
|
|
|
typedef void *Bar2::*FunctionPointerResolvedAsVoidStar; |
|
operator FunctionPointerResolvedAsVoidStar() const { return 0; } |
|
|
|
int C; |
|
Bar* pointerToStruct; |
|
int* pointerToPrimitive; |
|
Foo2* pointerToClass; |
|
Bar valueStruct; |
|
}; |
|
|
|
enum Enum |
|
{ |
|
A = 0, B = 2, C = 5, |
|
//D = 0x80000000, |
|
E = 0x1, |
|
F = -9, |
|
NAME_A = 10, |
|
NAME__A = 20 |
|
}; |
|
|
|
typedef char TypedefChar; |
|
|
|
class DLL_API Hello |
|
{ |
|
union NestedPrivate { |
|
int i; |
|
float f; |
|
}; |
|
|
|
public: |
|
union NestedPublic { |
|
int j; |
|
float g; |
|
long l; |
|
}; |
|
|
|
void PrintHello(const char* s); |
|
bool test1(int i, float f); |
|
int add(int a, int b); |
|
|
|
int AddFoo(Foo); |
|
int AddFooRef(Foo&); |
|
int AddFooPtr(Foo*); |
|
int AddFooPtrRef(Foo*&); |
|
Foo RetFoo(int a, float b); |
|
|
|
int AddFoo2(Foo2); |
|
|
|
int AddBar(Bar); |
|
int AddBar2(Bar2); |
|
|
|
int RetEnum(Enum); |
|
Hello* RetNull(); |
|
|
|
bool TestPrimitiveOut(CS_OUT float* f); |
|
bool TestPrimitiveOutRef(CS_OUT float& f); |
|
|
|
bool TestPrimitiveInOut(int* i); |
|
bool TestPrimitiveInOutRef(int& i); |
|
|
|
void EnumOut(int value, CS_OUT Enum* e); |
|
void EnumOutRef(int value, CS_OUT Enum& e); |
|
|
|
void EnumInOut(Enum* e); |
|
void EnumInOutRef(Enum& e); |
|
|
|
void StringOut(CS_OUT const char** str); |
|
void StringOutRef(CS_OUT const char*& str); |
|
void StringInOut(CS_IN_OUT const char** str); |
|
void StringInOutRef(CS_IN_OUT const char*& str); |
|
|
|
void StringTypedef(const TypedefChar* str); |
|
}; |
|
|
|
class DLL_API AbstractFoo |
|
{ |
|
public: |
|
virtual ~AbstractFoo(); |
|
virtual int pureFunction(int i = 0) = 0; |
|
virtual int pureFunction1() = 0; |
|
virtual int pureFunction2(bool* ok = 0) = 0; |
|
}; |
|
|
|
class DLL_API ImplementsAbstractFoo : public AbstractFoo |
|
{ |
|
public: |
|
typedef int typedefInOverride; |
|
virtual int pureFunction(typedefInOverride i = 0); |
|
virtual int pureFunction1(); |
|
private: |
|
virtual int pureFunction2(bool* ok = 0); |
|
}; |
|
|
|
class DLL_API ReturnsAbstractFoo |
|
{ |
|
public: |
|
const AbstractFoo& getFoo(); |
|
|
|
private: |
|
ImplementsAbstractFoo i; |
|
}; |
|
|
|
int DLL_API unsafeFunction(const Bar& ret, char* testForString, void (*foo)(int)); |
|
|
|
DLL_API Bar indirectReturn(); |
|
|
|
// Tests CheckVirtualOverrideReturnCovariance |
|
struct Exception; |
|
typedef Exception Ex1; |
|
|
|
struct DerivedException; |
|
typedef DerivedException Ex2; |
|
|
|
struct DLL_API Exception : public Foo |
|
{ |
|
virtual ~Exception(); |
|
virtual Ex1* clone() = 0; |
|
}; |
|
|
|
struct DLL_API DerivedException : public Exception |
|
{ |
|
virtual Ex2* clone() override; |
|
}; |
|
|
|
// Tests for ambiguous call to native functions with default parameters |
|
struct DLL_API DefaultParameters |
|
{ |
|
void Foo(int a, int b = 0); |
|
void Foo(int a); |
|
|
|
void Bar() const; |
|
void Bar(); |
|
}; |
|
|
|
// The Curiously Recurring Template Pattern (CRTP) |
|
template<class Derived> |
|
class Base |
|
{ |
|
// methods within Base can use template to access members of Derived |
|
Derived* create() { return new Derived(); } |
|
}; |
|
|
|
class Derived : public Base<Derived> |
|
{ |
|
}; |
|
|
|
// Tests the MoveFunctionToClassPass |
|
class DLL_API common |
|
{ |
|
}; |
|
|
|
DLL_API int test(common& s); |
|
|
|
// Tests the MoveOperatorToClassPass |
|
struct DLL_API TestMoveOperatorToClass |
|
{ |
|
TestMoveOperatorToClass(); |
|
int A; |
|
int B; |
|
}; |
|
|
|
DLL_API int operator *(TestMoveOperatorToClass klass, int b); |
|
|
|
DLL_API TestMoveOperatorToClass operator-(const TestMoveOperatorToClass& b); |
|
|
|
DLL_API TestMoveOperatorToClass operator+(const TestMoveOperatorToClass& b1, |
|
const TestMoveOperatorToClass& b2); |
|
|
|
// Not a valid operator overload for Foo2 in managed code - comparison operators need to return bool. |
|
DLL_API int operator==(const Foo2& a, const Foo2& b); |
|
|
|
// Tests delegates |
|
typedef int (*DelegateInGlobalNamespace)(int); |
|
typedef int (STDCALL *DelegateStdCall)(int); |
|
typedef int (CDECL *DelegateCDecl)(int n); |
|
typedef void(*DelegateNullCheck)(void); |
|
|
|
struct DLL_API TestDelegates |
|
{ |
|
typedef int (*DelegateInClass)(int); |
|
typedef int(TestDelegates::*MemberDelegate)(int); |
|
|
|
TestDelegates(); |
|
static int Double(int N); |
|
int Triple(int N); |
|
|
|
int StdCall(DelegateStdCall del); |
|
int CDecl(DelegateCDecl del); |
|
void MarshalUnattributedDelegate(DelegateInGlobalNamespace del); |
|
|
|
int MarshalAnonymousDelegate(int (*del)(int n)); |
|
void MarshalAnonymousDelegate2(int (*del)(int n)); |
|
void MarshalAnonymousDelegate3(float (*del)(float n)); |
|
int (*MarshalAnonymousDelegate4())(int n); |
|
int MarshalAnonymousDelegate5(int (STDCALL *del)(int n)); |
|
int MarshalAnonymousDelegate6(int (STDCALL *del)(int n)); |
|
|
|
void MarshalDelegateInAnotherUnit(DelegateInAnotherUnit del); |
|
|
|
DelegateNullCheck MarshalNullDelegate(); |
|
|
|
DelegateInClass A; |
|
DelegateInGlobalNamespace B; |
|
// As long as we can't marshal them make sure they're ignored |
|
MemberDelegate C; |
|
}; |
|
|
|
namespace DelegateNamespace |
|
{ |
|
namespace Nested |
|
{ |
|
void DLL_API f1(void (*)()); |
|
} |
|
|
|
void DLL_API f2(void (*)()); |
|
} |
|
|
|
// Tests memory leaks in constructors |
|
// C#: Marshal.FreeHGlobal(arg0); |
|
struct DLL_API TestMemoryLeaks |
|
{ |
|
TestMemoryLeaks(const char* name) {} |
|
}; |
|
|
|
// Tests that finalizers are generated |
|
/* CLI: ~TestFinalizers() */ |
|
struct DLL_API TestFinalizers |
|
{ |
|
}; |
|
|
|
// Tests static classes |
|
struct DLL_API TestStaticClass |
|
{ |
|
static int Add(int a, int b); |
|
|
|
static int GetOneTwoThree(); |
|
|
|
TestStaticClass& operator=(const TestStaticClass& oth); |
|
|
|
private: |
|
|
|
static int _Mult(int a, int b); |
|
|
|
static int GetFourFiveSix(); |
|
|
|
TestStaticClass(); |
|
}; |
|
|
|
struct DLL_API TestStaticClassDerived : TestStaticClass |
|
{ |
|
static int Foo(); |
|
|
|
private: |
|
TestStaticClassDerived(); |
|
}; |
|
|
|
class DLL_API TestNotStaticClass |
|
{ |
|
public: |
|
static TestNotStaticClass StaticFunction(); |
|
private: |
|
TestNotStaticClass(); |
|
}; |
|
|
|
class HasIgnoredField |
|
{ |
|
Base<Derived> fieldOfIgnoredType; |
|
}; |
|
|
|
template <typename T> |
|
class DependentTypeWithNestedIndependent |
|
{ |
|
T array[1]; |
|
|
|
union |
|
{ |
|
int i; |
|
long l; |
|
}; |
|
}; |
|
|
|
class DLL_API TestCopyConstructorRef |
|
{ |
|
public: |
|
TestCopyConstructorRef(); |
|
TestCopyConstructorRef(const TestCopyConstructorRef& other); |
|
int A; |
|
float B; |
|
}; |
|
|
|
template <class T> |
|
struct EmptyNamedNestedEnum |
|
{ |
|
enum { Value = 10 }; |
|
}; |
|
|
|
typedef unsigned long foo_t; |
|
typedef struct DLL_API SomeStruct |
|
{ |
|
SomeStruct(); |
|
foo_t p; |
|
} SomeStruct; |
|
|
|
class DLL_API SomeClassExtendingTheStruct : public SomeStruct |
|
{ |
|
}; |
|
|
|
namespace SomeNamespace |
|
{ |
|
class DLL_API NamespacedAbstractClass |
|
{ |
|
public: |
|
virtual void AbstractMethod() = 0; |
|
}; |
|
|
|
class DLL_API NamespacedAbstractImpl |
|
{ |
|
public: |
|
virtual void AbstractMethod(); |
|
}; |
|
|
|
class Inlines |
|
{ |
|
public: |
|
Inlines(int param) {} |
|
inline operator NamespacedAbstractImpl () const { return NamespacedAbstractImpl(); } |
|
protected: |
|
void protectedInlined() {} |
|
}; |
|
} |
|
|
|
// Test operator overloads |
|
class DLL_API ClassWithOverloadedOperators |
|
{ |
|
public: |
|
operator char(); |
|
operator int(); |
|
operator short(); |
|
|
|
virtual bool operator<(const ClassWithOverloadedOperators &other) const; |
|
}; |
|
|
|
// Tests global static function generation |
|
DLL_API int Function(); |
|
|
|
// Tests properties |
|
struct DLL_API TestProperties |
|
{ |
|
public: |
|
enum class NestedEnum |
|
{ |
|
Value1, |
|
Value2 |
|
}; |
|
|
|
enum class Conflict |
|
{ |
|
Value1, |
|
Value2 |
|
}; |
|
|
|
TestProperties(); |
|
TestProperties(const TestProperties& other); |
|
TestProperties& operator=(const TestProperties& other); |
|
int Field; |
|
const int& ConstRefField; |
|
|
|
int getFieldValue(); |
|
void setFieldValue(int Value); |
|
|
|
bool isVirtual(); |
|
virtual void setVirtual(bool value); |
|
|
|
double refToPrimitiveInSetter() const; |
|
void setRefToPrimitiveInSetter(const double& value); |
|
|
|
int getterAndSetterWithTheSameName(); |
|
void getterAndSetterWithTheSameName(int value); |
|
|
|
int Get() const; |
|
void Set(int value); |
|
|
|
int get() const; |
|
void set(int value); |
|
|
|
int setterReturnsBoolean(); |
|
bool setSetterReturnsBoolean(int newValue); |
|
|
|
virtual int virtualSetterReturnsBoolean(); |
|
virtual bool setVirtualSetterReturnsBoolean(int newValue); |
|
|
|
int nestedEnum(); |
|
int nestedEnum(int i); |
|
|
|
int get32Bit(); |
|
bool isEmpty(); |
|
bool empty(); |
|
|
|
virtual int virtualGetter(); |
|
|
|
int startWithVerb(); |
|
void setStartWithVerb(int value); |
|
|
|
void setSetterBeforeGetter(bool value); |
|
bool isSetterBeforeGetter(); |
|
|
|
bool contains(char c); |
|
bool contains(const char* str); |
|
|
|
Conflict GetConflict(); |
|
void SetConflict(Conflict _conflict); |
|
|
|
virtual int(*getCallback())(int); |
|
virtual void setCallback(int(*value)(int)); |
|
|
|
int GetArchiveName() const; |
|
|
|
protected: |
|
const int ArchiveName; |
|
|
|
private: |
|
int FieldValue; |
|
double _refToPrimitiveInSetter; |
|
int _getterAndSetterWithTheSameName; |
|
int _setterReturnsBoolean; |
|
int _virtualSetterReturnsBoolean; |
|
Conflict _conflict; |
|
int(*_callback)(int); |
|
}; |
|
|
|
class DLL_API HasOverridenSetter : public TestProperties |
|
{ |
|
public: |
|
void setVirtual(bool value) override; |
|
|
|
int virtualSetterReturnsBoolean() override; |
|
bool setVirtualSetterReturnsBoolean(int value) override; |
|
|
|
int virtualGetter() override; |
|
void setVirtualGetter(int value); |
|
}; |
|
|
|
class DLL_API TypeMappedIndex |
|
{ |
|
public: |
|
TypeMappedIndex(); |
|
}; |
|
|
|
class DLL_API TestIndexedProperties |
|
{ |
|
public: |
|
TestIndexedProperties(); |
|
// Should lead to a read/write indexer with return type uint |
|
foo_t& operator[](int i); |
|
// Should lead to a read/write indexer with return type uint |
|
foo_t* operator[](float f); |
|
// Should lead to a read-only indexer with return type uint |
|
foo_t operator[](const char* name); |
|
// Should lead to a read-only indexer with return type uint* |
|
const foo_t& operator[](double d); |
|
// Should lead to a read/write indexer with return type TestProperties |
|
TestProperties* operator[](unsigned char b); |
|
// Should lead to a read-only indexer with return type TestProperties |
|
const TestProperties& operator[](short b); |
|
// Should lead to a read-only indexer with argument type TestProperties |
|
foo_t operator[](TestProperties b); |
|
Bar& operator[](unsigned long i); |
|
Bar& operator[](const TypeMappedIndex& key); |
|
Bar& operator[](const Foo& key); |
|
// Test that we do not generate 'ref int' parameters as C# does not allow it |
|
int operator[](CS_OUT char key); |
|
|
|
private: |
|
foo_t p; |
|
TestProperties f; |
|
Bar bar; |
|
}; |
|
|
|
struct DLL_API TestIndexedPropertiesInValueType |
|
{ |
|
public: |
|
int operator[](int i); |
|
}; |
|
|
|
// Tests variables |
|
struct DLL_API TestVariables |
|
{ |
|
static int VALUE; |
|
void SetValue(int value = VALUE); |
|
}; |
|
|
|
typedef const wchar_t * LPCWSTR; |
|
struct DLL_API TestWideStrings |
|
{ |
|
LPCWSTR GetWidePointer(); |
|
LPCWSTR GetWideNullPointer(); |
|
}; |
|
|
|
enum struct MyEnum { A, B, C }; |
|
|
|
typedef void (*VoidPtrRetFunctionTypedef) (); |
|
|
|
class DLL_API TestFixedArrays |
|
{ |
|
public: |
|
VoidPtrRetFunctionTypedef Array[10]; |
|
#ifndef _MSC_VER |
|
TestWideStrings ZeroSizedClassArray[0]; |
|
MyEnum ZeroSizedEnumArray[0]; |
|
#endif |
|
int ZeroSizedArray[0]; |
|
}; |
|
|
|
class DLL_API TestArraysPointers |
|
{ |
|
public: |
|
TestArraysPointers(MyEnum *values, int count); |
|
|
|
MyEnum Value; |
|
}; |
|
|
|
class DLL_API NonPrimitiveType |
|
{ |
|
public: |
|
int GetFoo(); |
|
|
|
int foo; |
|
}; |
|
|
|
class DLL_API TestFixedNonPrimitiveArrays |
|
{ |
|
public: |
|
NonPrimitiveType NonPrimitiveTypeArray[3]; |
|
}; |
|
|
|
struct DLL_API TestGetterSetterToProperties |
|
{ |
|
int getWidth(); |
|
int getHeight(); |
|
}; |
|
|
|
// Tests conversion operators of classes |
|
class DLL_API ClassA |
|
{ |
|
public: |
|
ClassA(int value); |
|
ClassA(const ClassA& other, bool param = true); |
|
int Value; |
|
}; |
|
class DLL_API ClassB |
|
{ |
|
public: |
|
// conversion from ClassA (constructor): |
|
ClassB(const ClassA& x); |
|
int Value; |
|
// conversion from ClassA (assignment): |
|
//ClassB& operator= (const ClassA& x) { return *this; } |
|
// conversion to ClassA (type-cast operator) |
|
//operator ClassA() { return ClassA(); } |
|
}; |
|
class DLL_API ClassC |
|
{ |
|
public: |
|
// This should NOT lead to a conversion |
|
ClassC(const ClassA* x); |
|
// This should lead to an explicit conversion |
|
explicit ClassC(const ClassB& x); |
|
int Value; |
|
}; |
|
|
|
class DLL_API ClassD |
|
{ |
|
public: |
|
ClassD(int value); |
|
// Accessing this field should return reference, not a copy. |
|
ClassA Field; |
|
}; |
|
|
|
// Test decltype |
|
int Expr = 0; |
|
DLL_API decltype(Expr) TestDecltype(); |
|
|
|
DLL_API void TestNullPtrType(decltype(nullptr)); |
|
|
|
DLL_API decltype(nullptr) TestNullPtrTypeRet(); |
|
|
|
// Tests dependent name types |
|
template<typename T> struct DependentType |
|
{ |
|
DependentType(typename T::Dependent* t) { } |
|
|
|
private: |
|
struct Bitset { int length : sizeof(T); }; |
|
}; |
|
|
|
class PureDtor |
|
{ |
|
public: |
|
virtual ~PureDtor() = 0; |
|
}; |
|
|
|
class PureImplementedDtor |
|
{ |
|
public: |
|
virtual ~PureImplementedDtor() = 0; |
|
}; |
|
|
|
PureImplementedDtor::~PureImplementedDtor() |
|
{ |
|
} |
|
|
|
DLL_API void va_listFunction(va_list v); |
|
|
|
struct DLL_API TestNestedTypes |
|
{ |
|
public: |
|
union as_types |
|
{ |
|
int as_int; |
|
struct uchars |
|
{ |
|
unsigned char blue, green, red, alpha; |
|
} as_uchar; |
|
}; |
|
int toVerifyCorrectLayoutBefore; |
|
union |
|
{ |
|
int i; |
|
char c; |
|
}; |
|
int toVerifyCorrectLayoutAfter; |
|
}; |
|
|
|
class DLL_API HasStdString |
|
{ |
|
public: |
|
std::string testStdString(const std::string& s); |
|
std::string testStdStringPassedByValue(std::string s); |
|
std::string s; |
|
std::string& getStdString(); |
|
}; |
|
|
|
class DLL_API InternalCtorAmbiguity |
|
{ |
|
public: |
|
InternalCtorAmbiguity(void* param); |
|
}; |
|
|
|
class DLL_API InvokesInternalCtorAmbiguity |
|
{ |
|
public: |
|
InvokesInternalCtorAmbiguity(); |
|
InternalCtorAmbiguity* InvokeInternalCtor(); |
|
private: |
|
InternalCtorAmbiguity* ptr; |
|
}; |
|
|
|
class DLL_API HasFriend |
|
{ |
|
public: |
|
HasFriend(int m); |
|
DLL_API friend const HasFriend operator+(const HasFriend& f1, const HasFriend& f2); |
|
DLL_API friend const HasFriend operator-(const HasFriend& f1, const HasFriend& f2); |
|
int getM(); |
|
private: |
|
int m; |
|
}; |
|
|
|
template<typename T> class FriendTemplate |
|
{ |
|
template<typename TT> |
|
friend FriendTemplate<TT> func(const FriendTemplate<TT>&); |
|
|
|
template<typename TT> |
|
friend class FriendTemplate; |
|
}; |
|
|
|
class DLL_API DifferentConstOverloads |
|
{ |
|
public: |
|
DifferentConstOverloads(); |
|
int getI() const; |
|
bool operator ==(const DifferentConstOverloads& other); |
|
bool operator !=(const DifferentConstOverloads& other); |
|
bool operator ==(int number) const; |
|
bool operator ==(std::string s) const; |
|
private: |
|
int i; |
|
}; |
|
|
|
DLL_API bool operator ==(const DifferentConstOverloads& d, const char* s); |
|
|
|
class TestNamingAnonymousTypesInUnion |
|
{ |
|
public: |
|
union { |
|
struct { |
|
} argb; |
|
struct { |
|
} ahsv; |
|
struct { |
|
} acmyk; |
|
} ct; |
|
}; |
|
|
|
class DLL_API RefTypeClassPassTry |
|
{ |
|
}; |
|
|
|
void DLL_API funcTryRefTypePtrOut(CS_OUT RefTypeClassPassTry* classTry); |
|
void DLL_API funcTryRefTypeOut(CS_OUT RefTypeClassPassTry classTry); |
|
|
|
#define ARRAY_LENGTH 5 |
|
#define CS_VALUE_TYPE |
|
struct CS_VALUE_TYPE ValueTypeArrays |
|
{ |
|
float firstValueTypeArrray[ARRAY_LENGTH]; |
|
int secondValueTypeArray[ARRAY_LENGTH]; |
|
char thirdValueTypeArray[ARRAY_LENGTH]; |
|
size_t size; |
|
}; |
|
|
|
class DLL_API HasVirtualProperty |
|
{ |
|
public: |
|
virtual int getProperty(); |
|
virtual void setProperty(int target); |
|
protected: |
|
virtual int getProtectedProperty(); |
|
virtual void setProtectedProperty(int value); |
|
}; |
|
|
|
class DLL_API ChangedAccessOfInheritedProperty : public HasVirtualProperty |
|
{ |
|
public: |
|
int getProtectedProperty(); |
|
void setProtectedProperty(int value); |
|
protected: |
|
int getProperty(); |
|
void setProperty(int value); |
|
}; |
|
|
|
class DLL_API Empty |
|
{ |
|
}; |
|
|
|
class DLL_API ReturnsEmpty |
|
{ |
|
public: |
|
Empty getEmpty(); |
|
}; |
|
|
|
class DLL_API CS_VALUE_TYPE ValueTypeClassPassTry { }; |
|
|
|
void DLL_API funcTryValTypePtrOut(CS_OUT ValueTypeClassPassTry* classTry); |
|
void DLL_API funcTryValTypeOut(CS_OUT ValueTypeClassPassTry classTry); |
|
|
|
class DLL_API HasProblematicFields |
|
{ |
|
public: |
|
HasProblematicFields(); |
|
bool b; |
|
char c; |
|
}; |
|
|
|
class DLL_API HasVirtualReturningHasProblematicFields |
|
{ |
|
public: |
|
virtual HasProblematicFields returnsProblematicFields(); |
|
}; |
|
|
|
class DLL_API BaseClassVirtual |
|
{ |
|
public: |
|
typedef Foo Foo1; |
|
virtual int retInt(const Foo1& foo); |
|
static BaseClassVirtual getBase(); |
|
}; |
|
|
|
class DLL_API DerivedClassVirtual : public BaseClassVirtual |
|
{ |
|
public: |
|
typedef Foo Foo2; |
|
virtual int retInt(const Foo2& foo); |
|
}; |
|
|
|
class DLL_API DerivedClassAbstractVirtual : public DerivedClassVirtual |
|
{ |
|
public: |
|
virtual int retInt(const Foo& foo) = 0; |
|
}; |
|
|
|
class DLL_API DerivedClassOverrideAbstractVirtual : public DerivedClassAbstractVirtual |
|
{ |
|
public: |
|
virtual int retInt(const Foo& foo); |
|
}; |
|
|
|
class DLL_API BufferForVirtualFunction : public BaseClassVirtual |
|
{ |
|
}; |
|
|
|
class DLL_API OverridesNonDirectVirtual : public BufferForVirtualFunction |
|
{ |
|
public: |
|
virtual int retInt(const Foo& foo); |
|
}; |
|
|
|
namespace boost |
|
{ |
|
template <class T> struct is_member_pointer_cv { static const bool value = false; }; |
|
template <class T, class U>struct is_member_pointer_cv<T U::*> { static const bool value = true; }; |
|
|
|
// all of this below tests corner cases with type locations |
|
template<class T> |
|
struct make_tuple_traits |
|
{ |
|
typedef T type; |
|
|
|
// commented away, see below (JJ) |
|
// typedef typename IF< |
|
// boost::is_function<T>::value, |
|
// T&, |
|
// T>::RET type; |
|
}; |
|
|
|
namespace detail |
|
{ |
|
struct swallow_assign; |
|
typedef void (detail::swallow_assign::*ignore_t)(); |
|
struct swallow_assign |
|
{ |
|
swallow_assign(ignore_t(*)(ignore_t)); |
|
template<typename T> |
|
swallow_assign const& operator=(const T&) const; |
|
}; |
|
|
|
swallow_assign::swallow_assign(ignore_t (*)(ignore_t)) |
|
{ |
|
} |
|
|
|
template<typename T> |
|
swallow_assign const& swallow_assign::operator=(const T&) const |
|
{ |
|
return *this; |
|
} |
|
|
|
} // namespace detail |
|
|
|
template<> |
|
struct make_tuple_traits<detail::ignore_t(detail::ignore_t)> |
|
{ |
|
typedef detail::swallow_assign type; |
|
}; |
|
|
|
template<class T> |
|
struct is_class_or_union |
|
{ |
|
template <class U> |
|
static char is_class_or_union_tester(void(U::*)(void)); |
|
}; |
|
} |
|
|
|
template <std::size_t N, std::size_t... I> |
|
struct build_index_impl : build_index_impl<N - 1, N - 1, I...> {}; |
|
|
|
template <typename T> |
|
class AbstractTemplate |
|
{ |
|
public: |
|
AbstractTemplate(); |
|
virtual void abstractFunction() = 0; |
|
}; |
|
|
|
template <typename T> |
|
AbstractTemplate<T>::AbstractTemplate() |
|
{ |
|
} |
|
|
|
class DLL_API AbstractWithVirtualDtor |
|
{ |
|
public: |
|
virtual ~AbstractWithVirtualDtor(); |
|
virtual void abstract() = 0; |
|
}; |
|
|
|
class DLL_API NonTrivialDtorBase |
|
{ |
|
public: |
|
~NonTrivialDtorBase(); |
|
}; |
|
|
|
class DLL_API NonTrivialDtor : public NonTrivialDtorBase |
|
{ |
|
public: |
|
NonTrivialDtor(); |
|
~NonTrivialDtor(); |
|
static bool getDtorCalled(); |
|
static void setDtorCalled(bool value); |
|
private: |
|
static bool dtorCalled; |
|
}; |
|
|
|
template <class T> class ForwardedTemplate; |
|
|
|
ForwardedTemplate<int> returnsForwardedTemplate(); |
|
|
|
template <class T> class ForwardedTemplate |
|
{ |
|
ForwardedTemplate<T> functionInForwardedTemplate() const; |
|
}; |
|
|
|
template <class T> |
|
ForwardedTemplate<T> ForwardedTemplate<T>::functionInForwardedTemplate() const |
|
{ |
|
return ForwardedTemplate<T>(); |
|
} |
|
|
|
template <typename T> |
|
class TemplateWithVirtual |
|
{ |
|
public: |
|
TemplateWithVirtual(); |
|
virtual void v(); |
|
}; |
|
|
|
template <class T> |
|
TemplateWithVirtual<T>::TemplateWithVirtual() |
|
{ |
|
} |
|
|
|
template <class T> |
|
void TemplateWithVirtual<T>::v() |
|
{ |
|
} |
|
|
|
template <typename T> |
|
int FunctionTemplateWithDependentTypeDefaultExpr(size_t size = sizeof(T)) { |
|
return size; |
|
} |
|
|
|
class DLL_API DerivedFromTemplateInstantiationWithVirtual : public TemplateWithVirtual<int> |
|
{ |
|
}; |
|
|
|
typedef union |
|
{ |
|
int c; |
|
} union_t; |
|
|
|
int DLL_API func_union(union_t u); |
|
|
|
class DLL_API HasProtectedEnum |
|
{ |
|
protected: |
|
enum class ProtectedEnum |
|
{ |
|
Member1, |
|
Member2 |
|
}; |
|
void function(ProtectedEnum param); |
|
}; |
|
|
|
using custom_int_t = int; |
|
DLL_API void FuncWithTypeAlias(custom_int_t i); |
|
|
|
template<typename T> |
|
using TypeAliasTemplate = TemplateWithVirtual<T>; |
|
DLL_API void FuncWithTemplateTypeAlias(TypeAliasTemplate<int> i); |
|
|
|
struct TestsTypes |
|
{ |
|
int(*FunctionNoProto)(); |
|
}; |
|
|
|
template <class T> |
|
struct SpecialisesVoid |
|
{ |
|
private: |
|
T t; |
|
}; |
|
|
|
template <class T> |
|
class SpecialisesVoidInUnion |
|
{ |
|
union { |
|
SpecialisesVoid<T>* e; |
|
}* u; |
|
}; |
|
|
|
class UsesSpecialisationOfVoid |
|
{ |
|
private: |
|
SpecialisesVoid<void>* s; |
|
SpecialisesVoidInUnion<void>* h; |
|
SpecialisesVoid<int> i; |
|
SpecialisesVoid<long> l; |
|
SpecialisesVoid<unsigned int> u; |
|
}; |
|
|
|
class DLL_API HasAbstractOperator |
|
{ |
|
public: |
|
virtual bool operator==(const HasAbstractOperator& other) = 0; |
|
}; |
|
|
|
template<size_t _Len, class _Ty> |
|
struct _Aligned; |
|
|
|
template<size_t _Len> |
|
struct _Aligned<_Len, int> |
|
{ |
|
typedef int type; |
|
}; |
|
|
|
template<size_t _Len> |
|
struct _Aligned<_Len, char> |
|
{ |
|
typedef typename _Aligned<_Len, int>::type type; |
|
}; |
|
|
|
typedef _Aligned<16, char>::type type; |
|
|
|
template <typename T, template <typename> class InteriorRings = SpecialisesVoid> |
|
struct polygon |
|
{ |
|
InteriorRings<T> interior_rings; |
|
}; |
|
|
|
class HasSystemBase : public std::string |
|
{ |
|
}; |
|
|
|
typedef SpecialisesVoid<std::vector<std::string>> SpecialisesWithNestedSystemTypes; |
|
|
|
enum |
|
{ |
|
EmptyEnumsWithSameMemberPrefix1, |
|
EmptyEnumsWithSameMemberPrefix2 |
|
}; |
|
|
|
enum |
|
{ |
|
EmptyEnumsWithSameMemberPrefix3, |
|
EmptyEnumsWithSameMemberPrefix4 |
|
}; |
|
|
|
enum |
|
{ |
|
EmptyEnumsWithSameMemberPrefixAndUnderscore_1, |
|
EmptyEnumsWithSameMemberPrefixAndUnderscore_2 |
|
}; |
|
|
|
enum |
|
{ |
|
EmptyEnumsWithSameMemberPrefixAndUnderscore_3, |
|
EmptyEnumsWithSameMemberPrefixAndUnderscore_4 |
|
}; |
|
|
|
class DLL_API HasOverloadsWithDifferentPointerKindsToSameType |
|
{ |
|
public: |
|
void overload(int& i); |
|
void overload(int&& i); |
|
void overload(const int& i); |
|
void overload(const Foo& rx, int from = -1); |
|
void overload(Foo& rx, int from = -1); |
|
void overload(const Foo2& rx, int from = -1); |
|
void overload(Foo2&& rx, int from = -1); |
|
void dispose(); |
|
}; |
|
|
|
DLL_API void hasPointerParam(Foo* foo, int i); |
|
DLL_API void hasPointerParam(const Foo& foo); |
|
|
|
enum EmptyEnum { }; |
|
|
|
enum __enum_with_underscores { lOWER_BEFORE_CAPITAL, CAPITALS_More, underscore_at_end_, usesDigits1_0 }; |
|
|
|
void DLL_API sMallFollowedByCapital(); |
|
|
|
class DLL_API HasCopyAndMoveConstructor |
|
{ |
|
public: |
|
HasCopyAndMoveConstructor(int value); |
|
HasCopyAndMoveConstructor(const HasCopyAndMoveConstructor& other); |
|
HasCopyAndMoveConstructor(HasCopyAndMoveConstructor&& other); |
|
int getField(); |
|
private: |
|
int field; |
|
}; |
|
|
|
class DLL_API HasVirtualFunctionsWithStringParams |
|
{ |
|
public: |
|
virtual void PureVirtualFunctionWithStringParams(std::string testString1, std::string testString2) = 0; |
|
virtual int VirtualFunctionWithStringParam(std::string testString); |
|
}; |
|
|
|
class DLL_API ImplementsVirtualFunctionsWithStringParams : public HasVirtualFunctionsWithStringParams |
|
{ |
|
public: |
|
virtual void PureVirtualFunctionWithStringParams(std::string testString1, std::string testString2); |
|
}; |
|
|
|
class DLL_API HasVirtualFunctionWithBoolParams |
|
{ |
|
public: |
|
virtual bool virtualFunctionWithBoolParamAndReturnsBool(bool testBool); |
|
}; |
|
|
|
class DLL_API HasProtectedCtorWithProtectedParam |
|
{ |
|
protected: |
|
enum ProtectedEnum |
|
{ |
|
Member |
|
}; |
|
HasProtectedCtorWithProtectedParam(ProtectedEnum protectedParam); |
|
}; |
|
|
|
class DLL_API SecondaryBaseWithIgnoredVirtualMethod |
|
{ |
|
public: |
|
// HACK: do not delete: work around https://github.com/mono/CppSharp/issues/1534 |
|
~SecondaryBaseWithIgnoredVirtualMethod(); |
|
virtual void generated(); |
|
virtual void ignored(const IgnoredType& ignoredParam); |
|
}; |
|
|
|
class DLL_API DerivedFromSecondaryBaseWithIgnoredVirtualMethod : public Foo, public SecondaryBaseWithIgnoredVirtualMethod |
|
{ |
|
public: |
|
// HACK: do not delete: work around https://github.com/mono/CppSharp/issues/1534 |
|
~DerivedFromSecondaryBaseWithIgnoredVirtualMethod(); |
|
void generated(); |
|
void ignored(const IgnoredType& ignoredParam); |
|
}; |
|
|
|
class DLL_API AmbiguousParamNames |
|
{ |
|
public: |
|
AmbiguousParamNames(int instance, int in); |
|
}; |
|
|
|
class DLL_API HasPropertyNamedAsParent |
|
{ |
|
public: |
|
int hasPropertyNamedAsParent; |
|
}; |
|
|
|
class DLL_API ReturnByValueWithReturnParam |
|
{ |
|
public: |
|
int getUseCount(); |
|
|
|
private: |
|
std::shared_ptr<int> _ptr = std::shared_ptr<int>(new int[1]); |
|
}; |
|
|
|
class DLL_API ReturnByValueWithReturnParamFactory |
|
{ |
|
public: |
|
static ReturnByValueWithReturnParam generate(); |
|
}; |
|
|
|
struct DLL_API NestedUnionWithNested |
|
{ |
|
union |
|
{ |
|
struct |
|
{ |
|
int nestedField1; |
|
int nestedField2; |
|
}; |
|
int unionField; |
|
}; |
|
}; |
|
|
|
template<typename T> void TemplatedFunction(T type) |
|
{ |
|
|
|
} |
|
|
|
inline namespace InlineNamespace |
|
{ |
|
void FunctionInsideInlineNamespace() |
|
{ |
|
|
|
} |
|
} |
|
|
|
union |
|
{ |
|
struct |
|
{ |
|
struct |
|
{ |
|
long Capabilities; |
|
} Server; |
|
struct |
|
{ |
|
long Capabilities; |
|
} Share; |
|
} Smb2; |
|
} ProtocolSpecific; |
|
|
|
|
|
template<class _Other> |
|
using UsingTemplatePtr = _Other *; |
|
|
|
struct TemplateWithUsingTemplateMember |
|
{ |
|
UsingTemplatePtr<TemplateWithUsingTemplateMember> _Ref; |
|
}; |
|
|
|
namespace hasUnnamedDecl |
|
{ |
|
extern "C" |
|
{ |
|
} |
|
} |
|
|
|
enum ItemsDifferByCase |
|
{ |
|
Case_a, |
|
Case_A |
|
}; |
|
|
|
template <typename T> struct MyListBase |
|
{ |
|
protected: |
|
~MyListBase() {} |
|
}; |
|
|
|
template <typename T> |
|
class MyList : public MyListBase<T> |
|
{ |
|
public: |
|
inline MyList() { } |
|
}; |
|
|
|
template <> struct MyListBase<int> |
|
{ |
|
}; |
|
|
|
class MyIntList : public MyList<int> |
|
{ |
|
inline MyIntList(MyList<int> &&l) { } |
|
}; |
|
|
|
void MyFunc(MyList<void *> *list); |
|
|
|
template<class T> using InvokeGenSeq = typename T::Type; |
|
|
|
template<int N> struct DerivedTypeAlias; |
|
template<int N> using TypeAlias = InvokeGenSeq<DerivedTypeAlias<N>>; |
|
|
|
template<int N> |
|
struct DerivedTypeAlias : TypeAlias<N / 2> {}; |
|
|
|
DLL_API ImplementsAbstractFoo freeFunctionReturnsVirtualDtor(); |
|
DLL_API void integerOverload(int i); |
|
DLL_API void integerOverload(unsigned int i); |
|
DLL_API void integerOverload(long i); |
|
DLL_API void integerOverload(unsigned long i); |
|
DLL_API void takeReferenceToVoidStar(const void*& p); |
|
DLL_API void takeVoidStarStar(void** p); |
|
DLL_API void overloadPointer(void* p, int i = 0); |
|
DLL_API void overloadPointer(const void* p, int i = 0); |
|
DLL_API const char* takeReturnUTF8(const char* utf8); |
|
typedef const char* LPCSTR; |
|
DLL_API LPCSTR TakeTypedefedMappedType(LPCSTR string); |
|
DLL_API std::string UTF8; |
|
|
|
typedef enum SE4IpAddr_Tag { |
|
V4, |
|
V6, |
|
} SE4IpAddr_Tag; |
|
|
|
typedef struct { |
|
uint8_t _0[4]; |
|
} SE4V4_Body; |
|
|
|
typedef struct { |
|
uint8_t _0[16]; |
|
} SE4V6_Body; |
|
|
|
typedef struct { |
|
SE4IpAddr_Tag tag; |
|
union { |
|
SE4V4_Body v4; |
|
SE4V6_Body v6; |
|
}; |
|
} SE4IpAddr; |
|
|
|
struct DLL_API StructWithCopyCtor |
|
{ |
|
StructWithCopyCtor(); |
|
StructWithCopyCtor(const StructWithCopyCtor& other); |
|
uint16_t mBits; |
|
}; |
|
|
|
uint16_t DLL_API TestStructWithCopyCtorByValue(StructWithCopyCtor s); |
|
|
|
// Issue: https://github.com/mono/CppSharp/issues/1266 |
|
struct BaseCovariant; |
|
typedef std::unique_ptr<BaseCovariant> PtrCovariant; |
|
|
|
struct DLL_API BaseCovariant { |
|
virtual ~BaseCovariant(); |
|
virtual PtrCovariant clone() const = 0; |
|
}; |
|
|
|
struct DLL_API DerivedCovariant: public BaseCovariant { |
|
virtual ~DerivedCovariant(); |
|
std::unique_ptr<BaseCovariant> clone() const override { |
|
return PtrCovariant(new DerivedCovariant()); |
|
} |
|
}; |
|
|
|
// Issue: https://github.com/mono/CppSharp/issues/1268 |
|
template <typename T> |
|
class AbstractClassTemplate { |
|
public: |
|
virtual void func() = 0; |
|
}; |
|
|
|
class DerivedClass: public AbstractClassTemplate<int> { |
|
public: |
|
void func() override {} |
|
}; |
|
|
|
// Issue: https://github.com/mono/CppSharp/issues/1235 |
|
#include <functional> |
|
|
|
template <typename X, typename Y> |
|
class TemplateClassBase { |
|
public: |
|
using XType = X; |
|
}; |
|
|
|
template <typename A, typename B = A> |
|
class TemplateClass : TemplateClassBase<A,B> { |
|
public: |
|
using typename TemplateClassBase<A,B>::XType; |
|
using Func = std::function<B(XType)>; |
|
explicit TemplateClass(Func function) {} |
|
}; |
|
|
|
template <typename T> |
|
class QScopedPointer |
|
{ |
|
public: |
|
typedef T* QScopedPointer::* RestrictedBool; |
|
operator RestrictedBool() |
|
{ |
|
} |
|
}; |
|
|
|
template <typename T> |
|
struct dependentVariable { static const size_t var = alignof(T); }; |
|
|
|
class QObjectData { |
|
}; |
|
|
|
QScopedPointer<QObjectData> d_ptr; |
|
|
|
struct DLL_API PointerToTypedefPointerTest |
|
{ |
|
int val; |
|
}; |
|
typedef PointerToTypedefPointerTest *LPPointerToTypedefPointerTest; |
|
|
|
void DLL_API PointerToTypedefPointerTestMethod(LPPointerToTypedefPointerTest* lp, int valToSet); |
|
|
|
typedef int *LPINT; |
|
|
|
void DLL_API PointerToPrimitiveTypedefPointerTestMethod(LPINT lp, int valToSet); |
|
|
|
// this name must match a universally accessible system function or class to reproduce the bug |
|
struct system |
|
{ |
|
int32_t field1; |
|
int32_t field2; |
|
}; |
|
|
|
extern "C" |
|
{ |
|
DLL_API void takeConflictName(struct system* self); |
|
DLL_API struct system freeFunctionReturnByValue(); |
|
} // extern "C"
|
|
|