/+ REQUIRED_ARGS: -HC -c -o- PERMUTE_ARGS: TEST_OUTPUT: --- // Automatically generated by Digital Mars D Compiler #pragma once #include #include #include #include #ifdef CUSTOM_D_ARRAY_TYPE #define _d_dynamicArray CUSTOM_D_ARRAY_TYPE #else /// Represents a D [] array template struct _d_dynamicArray final { size_t length; T *ptr; _d_dynamicArray() : length(0), ptr(NULL) { } _d_dynamicArray(size_t length_in, T *ptr_in) : length(length_in), ptr(ptr_in) { } T& operator[](const size_t idx) { assert(idx < length); return ptr[idx]; } const T& operator[](const size_t idx) const { assert(idx < length); return ptr[idx]; } }; #endif struct Outer final { static Outer* outerPtr; static Middle::Inner* outerToInnerPtr; static Middle::InnerTmpl* outerToInnerTmplPtr; struct Middle final { static Outer* middleOuterPtr; static Middle* middlePtr; static Inner* middleInnerPtr; struct Inner final { static Outer* innerOuterPtr; static Middle* innerPtr; static Inner* innerInnerPtr; static InnerTmpl* innerInnerTmplPtr; Inner() { } }; template struct InnerTmpl final { static Outer* innerTmplOuterPtr; static Middle* innerTmplPtr; static Inner* innerTmplInnerPtr; static InnerTmpl* innerTmplInnerTmplPtr; InnerTmpl() { } }; Middle() { } }; template struct MiddleTmpl final { static MiddleTmpl* middleTmplPtr; static MiddleTmpl* middleTmplInnerTmplPtr; struct Inner final { static Inner* ptr; static MiddleTmpl* ptr2; Inner() { } }; template struct InnerTmpl final { static InnerTmpl* innerTmplPtr; static InnerTmpl* innerTmplPtrDiff; static MiddleTmpl* middleTmplInnerTmplPtr; static T a; static U bar(); InnerTmpl() { } }; MiddleTmpl() { } }; Outer() { } }; --- +/ extern(C++): struct Outer { __gshared Outer* outerPtr; __gshared Middle.Inner* outerToInnerPtr; __gshared Middle.InnerTmpl!int* outerToInnerTmplPtr; static struct Middle { __gshared Outer* middleOuterPtr; __gshared Middle* middlePtr; __gshared Inner* middleInnerPtr; static struct Inner { __gshared Outer* innerOuterPtr; __gshared Middle* innerPtr; __gshared Inner* innerInnerPtr; __gshared InnerTmpl!int* innerInnerTmplPtr; } static struct InnerTmpl(U) { __gshared Outer* innerTmplOuterPtr; __gshared Middle* innerTmplPtr; __gshared Inner* innerTmplInnerPtr; __gshared InnerTmpl* innerTmplInnerTmplPtr; } } static struct MiddleTmpl(T) { __gshared MiddleTmpl!T* middleTmplPtr; __gshared MiddleTmpl!T.Inner* middleTmplInnerTmplPtr; static struct Inner { __gshared Inner* ptr; __gshared MiddleTmpl!T.Inner* ptr2; } static struct InnerTmpl(U) { __gshared InnerTmpl* innerTmplPtr; __gshared InnerTmpl!char* innerTmplPtrDiff; __gshared MiddleTmpl!T.Inner* middleTmplInnerTmplPtr; __gshared T a; static U bar() { return U.init; } } } } /+ TEST_OUTPUT: --- extern Outer::Middle::Inner inner; extern Outer::Middle::InnerTmpl innerTmpl; extern Outer::MiddleTmpl::Inner middleTmpl; extern Outer::MiddleTmpl::InnerTmpl bothTmpl; --- +/ __gshared Outer.Middle.Inner inner; __gshared Outer.Middle.InnerTmpl!int innerTmpl; __gshared Outer.MiddleTmpl!int.Inner middleTmpl; __gshared Outer.MiddleTmpl!int.InnerTmpl!double bothTmpl; /+ TEST_OUTPUT: --- typedef Outer::MiddleTmpl::InnerTmpl FullTmplInst; template using FullTmpl = Outer::MiddleTmpl::InnerTmpl; --- +/ alias FullTmplInst = Outer.MiddleTmpl!int.InnerTmpl!double; alias FullTmpl = Outer.MiddleTmpl!int.InnerTmpl; /+ TEST_OUTPUT: --- extern void dotId(int32_t a = Outer::MiddleTmpl::InnerTmpl::a); --- +/ void dotId( int a = Outer.MiddleTmpl!int.InnerTmpl!double.a ) {} /+ TEST_OUTPUT: --- extern void castExp(double a = (double) Outer::MiddleTmpl::InnerTmpl::a); --- +/ void castExp( double a = Outer.MiddleTmpl!int.InnerTmpl!double.a ) {} /+ TEST_OUTPUT: --- extern void structLit(Outer::MiddleTmpl::InnerTmpl a = Outer::MiddleTmpl::InnerTmpl()); --- +/ void structLit( Outer.MiddleTmpl!int.InnerTmpl!double a = Outer.MiddleTmpl!int.InnerTmpl!double() ) {} /+ TEST_OUTPUT: --- extern void callExp(double a = Outer::MiddleTmpl::InnerTmpl::bar()); --- +/ void callExp( double a = Outer.MiddleTmpl!int.InnerTmpl!double.bar() ) {}