Mercurial > hg > CbC > CbC_gcc
diff gcc/testsuite/gdc.test/runnable_cxx/externmangle.d @ 152:2b5abeee2509
update gcc11
author | anatofuz |
---|---|
date | Mon, 25 May 2020 07:50:57 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/testsuite/gdc.test/runnable_cxx/externmangle.d Mon May 25 07:50:57 2020 +0900 @@ -0,0 +1,314 @@ +// EXTRA_CPP_SOURCES: externmangle.cpp + +extern(C++): + +struct Foo(X) +{ + X* v; +} + + +struct Boo(X) +{ + X* v; +} + + +void test1(Foo!int arg1); +void test2(int* arg2, Boo!(int*) arg1); + + +struct Test3(int X, int Y) +{ +} + +void test3(Test3!(3,3) arg1); + +void test4(Foo!(int*) arg1, Boo!(int*) arg2, Boo!(int*) arg3, int*, Foo!(double)); + +void test5(Foo!(int*) arg1, Boo!(int*) arg2, Boo!(int*) arg3); + + +struct Goo +{ + struct Foo(X) + { + X* v; + } + + struct Boo(X) + { + struct Xoo(Y) + { + Y* v; + }; + X* v; + } + + + void test6(Foo!(Boo!(Foo!(void))) arg1); + void test7(Boo!(void).Xoo!(int) arg1); +} + +struct P1 +{ + struct Mem(T) + { + } +} + +struct P2 +{ + struct Mem(T) + { + } +} + +void test8(P1.Mem!int, P2.Mem!int); +void test9(Foo!(int**), Foo!(int*), int**, int*); + + +interface Test10 +{ + private final void test10(); + public final void test11(); + protected final void test12(); + public final void test13() const; + + private void test14(); + public void test15(); + protected void test16(); + + private static void test17(); + public static void test18(); + protected static void test19(); +}; + +Test10 Test10Ctor(); +void Test10Dtor(ref Test10 ptr); + +struct Test20 +{ + __gshared: + private extern int test20; + protected extern int test21; + public extern int test22; +}; + + +int test23(Test10*, Test10, Test10**, const(Test10)); +int test23b(const Test10*, const Test10, Test10); + +void test24(int function(int,int)); + +void test25(int[291][6][5]* arr); +int test26(int[291][6]* arr); + +void test27(int, ...); +void test28(int); + +void test29(float); +void test30(const float); + +struct Array(T) +{ + int dim; +} + + +interface Module +{ + public static void imports(Module); + public static int dim(Array!Module*); +}; + +ulong testlongmangle(int a, uint b, long c, ulong d); + +__gshared extern int[2][2][2] test31; +__gshared extern int* test32; + + +alias int function(Expression , void* ) apply_fp_t; + +interface Expression +{ + public final int apply(apply_fp_t fp, apply_fp_t fp2, void* param); + public final int getType(); + public static Expression create(int); + public static void dispose(ref Expression); +} + +//int test34(int[0][0]*); +version(CRuntime_Microsoft){} +else +{ + int test35(real arg); +} + +const(char)* test36(const(char)*); + +final class Test37 +{ + static Test37 create() + { + return new Test37; + } + + bool test() + { + return true; + } +} + +bool test37(); + +interface Test38 +{ + final int test(int, ...); + public static Test38 create(); + public static void dispose(ref Test38); +} + +extern(C++) int test39cpp(C2!char, S2!(int)*); + +extern(C++, class) +struct S1 +{ + private int val; + static S1* init(int); + int value(); +} + +extern(C++, class) +struct S2(T) +{ + private T val; + static S2!T* init(int); + T value(); +} + +extern(C++, struct) +class C1 +{ + const(char)* data; + + static C1 init(const(char)* p); + const(char)* getDataCPP(); + extern(C++) const(char)* getDataD() + { + return data; + } +} + +extern(C++, struct) +class C2(T) +{ + const(T)* data; + + static C2!T init(const(T)* p); + const(T)* getData(); +} + +void test39() +{ + S1* s1 = S1.init(42); + assert(s1.value == 42); + assert(S2!int.init(43).value == 43); + const(char)* ptr = "test".ptr; + C1 c1 = C1.init(ptr); + assert(c1.getDataCPP() == ptr); + assert(c1.getDataD() == ptr); + C2!char c2 = C2!char.init(ptr); + assert(c2.getData() == ptr); + auto result = test39cpp(c2, S2!int.init(43)); + assert(result == 0); +} + + +void main() +{ + test1(Foo!int()); + test2(null, Boo!(int*)()); + test3(Test3!(3,3)()); + test4(Foo!(int*)(), Boo!(int*)(), Boo!(int*)(), null, Foo!(double)()); + test5(Foo!(int*)(), Boo!(int*)(), Boo!(int*)()); + Goo goo; + goo.test6(Goo.Foo!(Goo.Boo!(Goo.Foo!(void)))()); + goo.test7(Goo.Boo!(void).Xoo!(int)()); + + test8(P1.Mem!int(), P2.Mem!int()); + test9(Foo!(int**)(), Foo!(int*)(), null, null); + + auto t10 = Test10Ctor(); + scope(exit) Test10Dtor(t10); + + t10.test10(); + t10.test11(); + t10.test12(); + t10.test13(); + t10.test14(); + t10.test15(); + t10.test16(); + t10.test17(); + t10.test18(); + t10.test19(); + + assert(Test20.test20 == 20); + assert(Test20.test21 == 21); + assert(Test20.test22 == 22); + + assert(test23(null, null, null, null) == 1); + assert(test23b(null, null, null) == 1); + + extern(C++) static int cb(int a, int b){return a+b;} + + test24(&cb); + int[291][6][5] arr; + arr[1][1][1] = 42; + test25(&arr); + assert(test26(&arr[0]) == 42); + + test27(3,4,5); + test28(3); + + test29(3.14f); + test30(3.14f); + + auto t32 = &Module.imports; + Array!Module arr2; + arr2.dim = 20; + assert(Module.dim(&arr2) == 20); + + assert(testlongmangle(1, 2, 3, 4) == 10); + assert(test31 == [[[1, 1], [1, 1]], [[1, 1], [1, 1]]]); + assert(test32 == null); + + auto ee = Expression.create(42); + extern(C++) static int efun(Expression e, void* p) + { + return cast(int)(cast(size_t)p ^ e.getType()); + } + + extern(C++) static int efun2(Expression e, void* p) + { + return cast(int)(cast(size_t)p * e.getType()); + } + + auto test33 = ee.apply(&efun, &efun2, cast(void*)&Expression.create); + assert(test33 == cast(int)(cast(size_t)cast(void*)&Expression.create ^ 42) * cast(int)(cast(size_t)cast(void*)&Expression.create * 42)); + Expression.dispose(ee); + assert(ee is null); + //assert(test34(null) == 0); + version(CRuntime_Microsoft){} + else + { + assert(test35(3.14L) == 3); + } + const char* hello = "hello"; + assert(test36(hello) == hello); + assert(test37()); + auto t38 = Test38.create(); + assert(t38.test(1, 2, 3) == 1); + Test38.dispose(t38); + test39(); +}