dmd/compiler/test/compilable/test16495.d

117 lines
5.6 KiB
D

// https://issues.dlang.org/show_bug.cgi?id=16495
void types()
{
static assert(__traits(fullyQualifiedName, string) == "string");
static assert(__traits(fullyQualifiedName, wstring) == "wstring");
static assert(__traits(fullyQualifiedName, dstring) == "dstring");
static assert(__traits(fullyQualifiedName, typeof(null)) == "typeof(null)");
static assert(__traits(fullyQualifiedName, void) == "void");
static assert(__traits(fullyQualifiedName, const(void)) == "const(void)");
static assert(__traits(fullyQualifiedName, shared(void)) == "shared(void)");
static assert(__traits(fullyQualifiedName, shared const(void)) == "shared(const(void))");
static assert(__traits(fullyQualifiedName, shared inout(void)) == "shared(inout(void))");
static assert(__traits(fullyQualifiedName, shared inout const(void)) == "shared(inout(const(void)))");
static assert(__traits(fullyQualifiedName, inout(void)) == "inout(void)");
static assert(__traits(fullyQualifiedName, inout const(void)) == "inout(const(void))");
static assert(__traits(fullyQualifiedName, immutable(void)) == "immutable(void)");
}
struct QualifiedNameTests
{
struct Inner
{
bool value;
}
ref const(Inner[string]) func( ref Inner var1, lazy scope string var2 );
ref const(Inner[string]) retfunc( return ref Inner var1 );
Inner inoutFunc(inout Inner) inout;
shared(const(Inner[string])[]) data;
const Inner delegate(double, string) @safe nothrow deleg;
inout(int) delegate(inout int) inout inoutDeleg;
Inner function(out double, string) funcPtr;
extern(C) Inner function(double, string) cFuncPtr;
extern(C) void cVarArg(int, ...);
void dVarArg(...);
void dVarArg2(int, ...);
void typesafeVarArg(int[] ...);
Inner[] array;
Inner[16] sarray;
Inner[Inner] aarray;
const(Inner[const(Inner)]) qualAarray;
shared(immutable(Inner) delegate(ref double, scope string) const shared @trusted nothrow) attrDeleg;
struct Data(T) { int x; }
void tfunc(T...)(T args) {}
template Inst(alias A) { int x; }
class Test12309(T, int x, string s) {}
}
void symbols()
{
alias qnTests = QualifiedNameTests;
enum prefix = "test16495.QualifiedNameTests.";
static assert(__traits(fullyQualifiedName, qnTests.Inner) == prefix ~ "Inner");
static assert(__traits(fullyQualifiedName, qnTests.func) == prefix ~ "func");
static assert(__traits(fullyQualifiedName, qnTests.Data!int) == prefix ~ "Data!int.Data");
static assert(__traits(fullyQualifiedName, qnTests.Data!int.x) == prefix ~ "Data!int.Data.x");
static assert(__traits(fullyQualifiedName, qnTests.tfunc!(int[])) == prefix ~ "tfunc!(int[]).tfunc");
static assert(__traits(fullyQualifiedName, qnTests.Inst!(Object)) == prefix ~ "Inst!(Object)");
static assert(__traits(fullyQualifiedName, qnTests.Inst!(Object).x) == prefix ~ "Inst!(Object).x");
static assert(__traits(fullyQualifiedName, qnTests.Test12309!(int, 10, "str"))
== prefix ~ "Test12309!(int, 10, \"str\").Test12309");
}
void names()
{
enum prefix = "test16495.QualifiedNameTests";
enum xx = prefix ~ ".Inner";
with (QualifiedNameTests)
{
// Basic qualified name
static assert(__traits(fullyQualifiedName, Inner) == xx);
// Array types
static assert(__traits(fullyQualifiedName, typeof(array)) == xx ~ "[]");
static assert(__traits(fullyQualifiedName, typeof(sarray)) == xx ~ "[16]");
static assert(__traits(fullyQualifiedName, typeof(aarray)) == xx ~ "[" ~ xx ~ "]");
// qualified key for AA
static assert(__traits(fullyQualifiedName, typeof(qualAarray)) == "const(" ~ xx ~ "[const(" ~ xx ~ ")])");
// Qualified composed data types
static assert(__traits(fullyQualifiedName, typeof(data)) == "shared(const(" ~ xx ~ "[string])[])");
// Function types + function attributes
static assert(__traits(fullyQualifiedName, typeof(func)) == "ref const(" ~ xx ~ "[string])(ref " ~ xx ~ ", lazy scope string)");
static assert(__traits(fullyQualifiedName, typeof(retfunc)) == "ref const(" ~ xx ~ "[string])(return ref " ~ xx ~ ")");
static assert(__traits(fullyQualifiedName, typeof(inoutFunc)) == "inout "~xx~"(inout("~xx~"))");
static assert(__traits(fullyQualifiedName, typeof(deleg)) == "const(" ~ xx ~ " delegate(double, string) nothrow @safe)");
static assert(__traits(fullyQualifiedName, typeof(inoutDeleg)) == "inout(int) delegate(inout(int)) inout");
static assert(__traits(fullyQualifiedName, typeof(funcPtr)) == "" ~ xx ~ " function(out double, string)");
static assert(__traits(fullyQualifiedName, typeof(cFuncPtr)) == "extern (C) " ~ xx ~ " function(double, string)");
// Delegate type with qualified function type
static assert(__traits(fullyQualifiedName, typeof(attrDeleg)) == "shared(immutable(" ~ xx ~ ") "~
"delegate(ref double, scope string) shared const nothrow @trusted)");
// Variable argument function types
static assert(__traits(fullyQualifiedName, typeof(cVarArg)) == "extern (C) void(int, ...)");
static assert(__traits(fullyQualifiedName, typeof(dVarArg)) == "void(...)");
static assert(__traits(fullyQualifiedName, typeof(dVarArg2)) == "void(int, ...)");
static assert(__traits(fullyQualifiedName, typeof(typesafeVarArg)) == "void(int[]...)");
// SIMD vector
static if (is(__vector(float[4])))
{
static assert(__traits(fullyQualifiedName, __vector(float[4])) == "__vector(float[4])");
}
}
}