blob: 6cd45827820e8caca67cebf615f7e850fa7a2043 [file] [log] [blame]
/*
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;
}