/* RUN_OUTPUT: --- Success --- */ extern(C) int printf(const char*, ...); template TypeTuple(TL...) { alias TypeTuple = TL; } import core.stdc.math : isnan; /********************************************/ // https://issues.dlang.org/show_bug.cgi?id=9112 void test9112a() // T() and T(v) { void test(T)(T v) { foreach (string qual; TypeTuple!("", "const ", "immutable ")) { mixin("alias U = "~qual~T.stringof~";"); //pragma(msg, U); mixin("auto x1 = "~qual~T.stringof~"();"); // U() default construction syntax mixin("auto x2 = "~qual~T.stringof~"(v);"); // U(v) static assert(!__traits(compiles, mixin(qual~T.stringof~"(v, v)"))); // U(v, v) static assert(is(typeof(x1) == U)); static assert(is(typeof(x2) == U)); static if ( is(typeof(U.nan) : real)) assert( isnan(x1.re) && !isnan(x1.im), U.stringof); static if ( is(typeof(U.nan) : ireal)) assert(!isnan(x1.re) && isnan(x1.im), U.stringof); static if ( is(typeof(U.nan) : creal)) assert( isnan(x1.re) && isnan(x1.im), U.stringof); static if (!is(typeof(U.nan))) assert( x1 == U.init, U.stringof); assert(x2 == v, U.stringof); } } static assert(!__traits(compiles, { auto x1 = void(); })); static assert(!__traits(compiles, { auto x2 = void(1); })); test!( byte )(10); test!(ubyte )(10); test!( short )(10); test!(ushort )(10); test!( int )(10); test!(uint )(10); test!( long )(10); test!(ulong )(10); test!( float )(3.14); test!( double)(3.14); test!( real )(3.14); test!( char )('A'); test!(wchar )('A'); test!(dchar )('A'); test!(bool )(true); static assert(!__traits(compiles, int(1.42))); // in curre,t this is disallowed { int x; alias T = int*; //auto p = int*(&x); // Error: found '*' when expecting '.' following int //auto p = (int*)(&x); // Error: C style cast illegal, use cast(int*)&x auto p = T(&x); assert( p == &x); assert(*p == x); } } enum Enum : long { a = 10, b = 20 } void test9112b() // new T(v) { void test(T)(T v) { foreach (string qual; TypeTuple!("", "const ", "immutable ")) { mixin("alias U = "~qual~T.stringof~";"); //pragma(msg, U); mixin("auto p1 = new "~qual~T.stringof~"();"); // U() default construction syntax mixin("auto p2 = new "~qual~T.stringof~"(v);"); // U(v) static assert(!__traits(compiles, mixin("new "~qual~T.stringof~"(v, v)"))); // U(v, v) static assert(is(typeof(p1) == U*)); static assert(is(typeof(p2) == U*)); assert( p1 !is null); assert( p2 !is null); auto x1 = *p1; auto x2 = *p2; static if ( is(typeof(U.nan) : real)) assert( isnan(x1.re) && !isnan(x1.im), U.stringof); static if ( is(typeof(U.nan) : ireal)) assert(!isnan(x1.re) && isnan(x1.im), U.stringof); static if ( is(typeof(U.nan) : creal)) assert( isnan(x1.re) && isnan(x1.im), U.stringof); static if (!is(typeof(U.nan))) assert( x1 == U.init, U.stringof); assert(x2 == v, U.stringof); } } static assert(!__traits(compiles, { auto x1 = new void(); })); static assert(!__traits(compiles, { auto x2 = new void(1); })); static assert(!__traits(compiles, { auto x2 = new void(1, 2); })); test!( byte )(10); test!(ubyte )(10); test!( short )(10); test!(ushort )(10); test!( int )(10); test!(uint )(10); test!( long )(10); test!(ulong )(10); test!( float )(3.14); test!( double)(3.14); test!( real )(3.14); test!( char )('A'); test!(wchar )('A'); test!(dchar )('A'); test!(bool )(true); test!(Enum )(Enum.a); void testPtr(T)(T v) { T* pv = &v; T** ppv = new T*(pv); assert( *ppv == pv); assert(**ppv == v); } foreach (T; TypeTuple!(int, const long, immutable double)) { testPtr!T(10); } foreach (T; TypeTuple!(Enum, const Enum, immutable Enum)) { testPtr!T(Enum.a); } static assert(!__traits(compiles, new const int(1, 2))); static assert(!__traits(compiles, new int(1.42))); // in curre,t this is disallowed // int(1) in directly on statement scope should be parsed as an expression, but // would fail to compile because of "has no effect" error. static assert(!__traits(compiles, { int(1); })); } /********************************************/ int main() { test9112a(); test9112b(); printf("Success\n"); return 0; }