mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +03:00
149 lines
4.8 KiB
D
149 lines
4.8 KiB
D
/*
|
|
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;
|
|
}
|