update completions of `pragma` and `__traits` (#597)

This commit is contained in:
Basile-z 2019-04-22 17:46:40 +02:00 committed by GitHub
parent d42fec7590
commit ba60664f2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 541 additions and 80 deletions

View File

@ -6,8 +6,8 @@ $(HEADERNAV_TOC)
$(GRAMMAR $(GRAMMAR
$(GNAME Pragma): $(GNAME Pragma):
$(D pragma) $(D $(LPAREN)) $(I Identifier) $(D $(RPAREN)) $(D pragma) $(D $(LPAREN)) $(GLINK_LEX Identifier) $(D $(RPAREN))
$(D pragma) $(D $(LPAREN)) $(I Identifier) $(D ,) $(GLINK2 expression, ArgumentList) $(D $(RPAREN)) $(D pragma) $(D $(LPAREN)) $(GLINK_LEX Identifier) $(D ,) $(GLINK2 expression, ArgumentList) $(D $(RPAREN))
) )

View File

@ -56,6 +56,7 @@ $(GNAME TraitsKeyword):
$(GLINK getParameterStorageClasses) $(GLINK getParameterStorageClasses)
$(GLINK getPointerBitmap) $(GLINK getPointerBitmap)
$(GLINK getProtection) $(GLINK getProtection)
$(GLINK getTargetInfo)
$(GLINK getVirtualFunctions) $(GLINK getVirtualFunctions)
$(GLINK getVirtualMethods) $(GLINK getVirtualMethods)
$(GLINK getUnitTests) $(GLINK getUnitTests)
@ -84,6 +85,7 @@ $(H2 $(GNAME isArithmetic))
Otherwise, $(D false) is returned. Otherwise, $(D false) is returned.
If there are no arguments, $(D false) is returned.) If there are no arguments, $(D false) is returned.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -96,6 +98,7 @@ void main()
writeln(__traits(isArithmetic, int*)); writeln(__traits(isArithmetic, int*));
} }
--- ---
)
Prints: Prints:
@ -111,26 +114,118 @@ $(H2 $(GNAME isFloating))
$(P Works like $(D isArithmetic), except it's for floating $(P Works like $(D isArithmetic), except it's for floating
point types (including imaginary and complex types).) point types (including imaginary and complex types).)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : float4;
enum E : float { a, b }
static assert(__traits(isFloating, float));
static assert(__traits(isFloating, idouble));
static assert(__traits(isFloating, creal));
static assert(__traits(isFloating, E));
static assert(__traits(isFloating, float4));
static assert(!__traits(isFloating, float[4]));
---
)
$(H2 $(GNAME isIntegral)) $(H2 $(GNAME isIntegral))
$(P Works like $(D isArithmetic), except it's for integral $(P Works like $(D isArithmetic), except it's for integral
types (including character types).) types (including character types).)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : int4;
enum E { a, b }
static assert(__traits(isIntegral, bool));
static assert(__traits(isIntegral, char));
static assert(__traits(isIntegral, int));
static assert(__traits(isIntegral, E));
static assert(__traits(isIntegral, int4));
static assert(!__traits(isIntegral, float));
static assert(!__traits(isIntegral, int[4]));
static assert(!__traits(isIntegral, void*));
---
)
$(H2 $(GNAME isScalar)) $(H2 $(GNAME isScalar))
$(P Works like $(D isArithmetic), except it's for scalar $(P Works like $(D isArithmetic), except it's for scalar
types.) types.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : int4, void16;
enum E { a, b }
static assert(__traits(isScalar, bool));
static assert(__traits(isScalar, char));
static assert(__traits(isScalar, int));
static assert(__traits(isScalar, float));
static assert(__traits(isScalar, E));
static assert(__traits(isScalar, int4));
static assert(__traits(isScalar, void*)); // Includes pointers!
static assert(!__traits(isScalar, int[4]));
static assert(!__traits(isScalar, void16));
static assert(!__traits(isScalar, void));
static assert(!__traits(isScalar, typeof(null)));
static assert(!__traits(isScalar, Object));
---
)
$(H2 $(GNAME isUnsigned)) $(H2 $(GNAME isUnsigned))
$(P Works like $(D isArithmetic), except it's for unsigned $(P Works like $(D isArithmetic), except it's for unsigned
types.) types.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : uint4;
enum SignedEnum { a, b }
enum UnsignedEnum : uint { a, b }
static assert(__traits(isUnsigned, bool));
static assert(__traits(isUnsigned, char));
static assert(__traits(isUnsigned, uint));
static assert(__traits(isUnsigned, UnsignedEnum));
static assert(__traits(isUnsigned, uint4));
static assert(!__traits(isUnsigned, int));
static assert(!__traits(isUnsigned, float));
static assert(!__traits(isUnsigned, SignedEnum));
static assert(!__traits(isUnsigned, uint[4]));
static assert(!__traits(isUnsigned, void*));
---
)
$(H2 $(GNAME isStaticArray)) $(H2 $(GNAME isStaticArray))
$(P Works like $(D isArithmetic), except it's for static array $(P Works like $(D isArithmetic), except it's for static array
types.) types.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : int4;
enum E : int[4] { a = [1, 2, 3, 4] }
static array = [1, 2, 3]; // Not a static array: the type is inferred as int[] not int[3].
static assert(__traits(isStaticArray, void[0]));
static assert(__traits(isStaticArray, E));
static assert(!__traits(isStaticArray, int4));
static assert(!__traits(isStaticArray, array));
---
)
$(H2 $(GNAME isAssociativeArray)) $(H2 $(GNAME isAssociativeArray))
$(P Works like $(D isArithmetic), except it's for associative array $(P Works like $(D isArithmetic), except it's for associative array
@ -144,6 +239,7 @@ $(H2 $(GNAME isAbstractClass))
Otherwise, $(D false) is returned. Otherwise, $(D false) is returned.
If there are no arguments, $(D false) is returned.) If there are no arguments, $(D false) is returned.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -158,6 +254,7 @@ void main()
writeln(__traits(isAbstractClass, int*)); writeln(__traits(isAbstractClass, int*));
} }
--- ---
)
Prints: Prints:
@ -203,6 +300,7 @@ $(H2 $(GNAME isDisabled))
$(P Takes one argument and returns `true` if it's a function declaration $(P Takes one argument and returns `true` if it's a function declaration
marked with `@disable`.) marked with `@disable`.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
struct Foo struct Foo
{ {
@ -213,15 +311,18 @@ struct Foo
static assert(__traits(isDisabled, Foo.foo)); static assert(__traits(isDisabled, Foo.foo));
static assert(!__traits(isDisabled, Foo.bar)); static assert(!__traits(isDisabled, Foo.bar));
--- ---
)
$(P For any other declaration even if `@disable` is a syntactically valid $(P For any other declaration even if `@disable` is a syntactically valid
attribute `false` is returned because the annotation has no effect.) attribute `false` is returned because the annotation has no effect.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
@disable struct Bar{} @disable struct Bar{}
static assert(!__traits(isDisabled, Bar)); static assert(!__traits(isDisabled, Bar));
--- ---
)
$(H2 $(GNAME isVirtualFunction)) $(H2 $(GNAME isVirtualFunction))
@ -236,6 +337,7 @@ $(H2 $(GNAME isVirtualMethod))
Final functions that don't override anything return false. Final functions that don't override anything return false.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -255,6 +357,7 @@ void main()
writeln(__traits(isVirtualMethod, S.bar)); // false writeln(__traits(isVirtualMethod, S.bar)); // false
} }
--- ---
)
$(H2 $(GNAME isAbstractFunction)) $(H2 $(GNAME isAbstractFunction))
@ -262,6 +365,7 @@ $(H2 $(GNAME isAbstractFunction))
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -287,6 +391,7 @@ void main()
writeln(__traits(isAbstractFunction, AC.foo)); // true writeln(__traits(isAbstractFunction, AC.foo)); // true
} }
--- ---
)
$(H2 $(GNAME isFinalFunction)) $(H2 $(GNAME isFinalFunction))
@ -294,6 +399,7 @@ $(H2 $(GNAME isFinalFunction))
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -321,6 +427,7 @@ void main()
writeln(__traits(isFinalFunction, FC.foo)); // true writeln(__traits(isFinalFunction, FC.foo)); // true
} }
--- ---
)
$(H2 $(GNAME isOverrideFunction)) $(H2 $(GNAME isOverrideFunction))
@ -328,6 +435,7 @@ $(H2 $(GNAME isOverrideFunction))
$(D_KEYWORD override), $(D true) is returned, otherwise $(D false). $(D_KEYWORD override), $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -349,6 +457,7 @@ void main()
writeln(__traits(isOverrideFunction, Foo.bar)); // false writeln(__traits(isOverrideFunction, Foo.bar)); // false
} }
--- ---
)
$(H2 $(GNAME isStaticFunction)) $(H2 $(GNAME isStaticFunction))
@ -357,6 +466,22 @@ $(H2 $(GNAME isStaticFunction))
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
struct A
{
int foo() { return 3; }
static int boo(int a) { return a; }
}
void main()
{
assert(__traits(isStaticFunction, A.boo));
assert(!__traits(isStaticFunction, A.foo));
assert(__traits(isStaticFunction, main));
}
---
)
$(H2 $(GNAME isRef), $(GNAME isOut), $(GNAME isLazy)) $(H2 $(GNAME isRef), $(GNAME isOut), $(GNAME isLazy))
@ -365,6 +490,7 @@ $(H2 $(GNAME isRef), $(GNAME isOut), $(GNAME isLazy))
or $(D_KEYWORD lazy), otherwise $(D false). or $(D_KEYWORD lazy), otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
void fooref(ref int x) void fooref(ref int x)
{ {
@ -387,6 +513,7 @@ void foolazy(lazy int x)
static assert(__traits(isLazy, x)); static assert(__traits(isLazy, x));
} }
--- ---
)
$(H2 $(GNAME isTemplate)) $(H2 $(GNAME isTemplate))
@ -394,12 +521,14 @@ $(H2 $(GNAME isTemplate))
otherwise $(D false). otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
void foo(T)(){} void foo(T)(){}
static assert(__traits(isTemplate,foo)); static assert(__traits(isTemplate,foo));
static assert(!__traits(isTemplate,foo!int())); static assert(!__traits(isTemplate,foo!int()));
static assert(!__traits(isTemplate,"string")); static assert(!__traits(isTemplate,"string"));
--- ---
)
$(H2 $(GNAME isZeroInit)) $(H2 $(GNAME isZeroInit))
@ -440,6 +569,7 @@ $(H2 $(GNAME isReturnOnStack))
parameter to the function. parameter to the function.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
struct S { int[20] a; } struct S { int[20] a; }
int test1(); int test1();
@ -448,6 +578,7 @@ $(H2 $(GNAME isReturnOnStack))
static assert(__traits(isReturnOnStack, test1) == false); static assert(__traits(isReturnOnStack, test1) == false);
static assert(__traits(isReturnOnStack, test2) == true); static assert(__traits(isReturnOnStack, test2) == true);
--- ---
)
$(IMPLEMENTATION_DEFINED $(IMPLEMENTATION_DEFINED
This is determined by the function ABI calling convention in use, This is determined by the function ABI calling convention in use,
@ -472,6 +603,7 @@ $(H2 $(GNAME hasMember))
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -493,12 +625,14 @@ void main()
writeln(__traits(hasMember, int, "sizeof")); // true writeln(__traits(hasMember, int, "sizeof")); // true
} }
--- ---
)
$(H2 $(GNAME identifier)) $(H2 $(GNAME identifier))
$(P Takes one argument, a symbol. Returns the identifier $(P Takes one argument, a symbol. Returns the identifier
for that symbol as a string literal. for that symbol as a string literal.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -508,25 +642,50 @@ pragma(msg, typeof(__traits(identifier, var))); // string
writeln(var); // 123 writeln(var); // 123
writeln(__traits(identifier, var)); // "var" writeln(__traits(identifier, var)); // "var"
--- ---
)
$(H2 $(GNAME getAliasThis)) $(H2 $(GNAME getAliasThis))
$(P Takes one argument, a symbol of aggregate type. $(P Takes one argument, a type. If the type has `alias this` declarations,
If the given aggregate type has $(D alias this), returns a list of returns a sequence of the names (as `string`s) of the members used in
$(D alias this) names, by a tuple of $(D string)s. those declarations. Otherwise returns an empty sequence.
Otherwise returns an empty tuple.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
alias AliasSeq(T...) = T;
struct S1
{
string var;
alias var this;
}
static assert(__traits(getAliasThis, S1) == AliasSeq!("var"));
static assert(__traits(getAliasThis, int).length == 0);
pragma(msg, __traits(getAliasThis, S1));
pragma(msg, __traits(getAliasThis, int));
---
)
Prints:
$(CONSOLE
tuple("var")
tuple()
)
$(SECTION2 $(GNAME getAttributes), $(SECTION2 $(GNAME getAttributes),
$(P $(P
Takes one argument, a symbol. Returns a tuple of all attached user-defined attributes. Takes one argument, a symbol. Returns a tuple of all attached user-defined attributes.
If no UDA's exist it will return an empty tuple. If no UDAs exist it will return an empty tuple.
) )
$(P $(P
For more information, see: $(DDSUBLINK spec/attribute, uda, User-Defined Attributes) For more information, see: $(DDSUBLINK spec/attribute, uda, User-Defined Attributes)
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
@(3) int a; @(3) int a;
@("string", 7) int b; @("string", 7) int b;
@ -538,6 +697,7 @@ pragma(msg, __traits(getAttributes, a));
pragma(msg, __traits(getAttributes, b)); pragma(msg, __traits(getAttributes, b));
pragma(msg, __traits(getAttributes, c)); pragma(msg, __traits(getAttributes, c));
--- ---
)
Prints: Prints:
@ -564,6 +724,7 @@ $(SECTION2 $(GNAME getFunctionVariadicStyle),
$(TROW $(D "typesafe"), typesafe variadic function, array on stack, $(D void def(int[] ...))) $(TROW $(D "typesafe"), typesafe variadic function, array on stack, $(D void def(int[] ...)))
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import core.stdc.stdarg; import core.stdc.stdarg;
@ -583,6 +744,7 @@ static assert(__traits(getFunctionVariadicStyle, (int[] a...) {}) == "typesafe")
static assert(__traits(getFunctionVariadicStyle, typeof(cstyle)) == "stdarg"); static assert(__traits(getFunctionVariadicStyle, typeof(cstyle)) == "stdarg");
--- ---
) )
)
$(SECTION2 $(GNAME getFunctionAttributes), $(SECTION2 $(GNAME getFunctionAttributes),
$(P $(P
@ -608,10 +770,10 @@ $(SECTION2 $(GNAME getFunctionAttributes),
For example: For example:
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
int sum(int x, int y) pure nothrow { return x + y; } int sum(int x, int y) pure nothrow { return x + y; }
// prints ("pure", "nothrow", "@system")
pragma(msg, __traits(getFunctionAttributes, sum)); pragma(msg, __traits(getFunctionAttributes, sum));
struct S struct S
@ -619,16 +781,35 @@ struct S
void test() const @system { } void test() const @system { }
} }
// prints ("const", "@system")
pragma(msg, __traits(getFunctionAttributes, S.test)); pragma(msg, __traits(getFunctionAttributes, S.test));
void main(){}
--- ---
)
Prints:
$(CONSOLE
tuple("pure", "nothrow", "@system")
tuple("const", "@system")
)
$(P Note that some attributes can be inferred. For example:) $(P Note that some attributes can be inferred. For example:)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
// prints ("pure", "nothrow", "@nogc", "@trusted")
pragma(msg, __traits(getFunctionAttributes, (int x) @trusted { return x * 2; })); pragma(msg, __traits(getFunctionAttributes, (int x) @trusted { return x * 2; }));
void main(){}
--- ---
)
Prints:
$(CONSOLE
tuple("pure", "nothrow", "@nogc", "@trusted")
)
)
) )
$(H2 $(GNAME getLinkage)) $(H2 $(GNAME getLinkage))
@ -645,11 +826,11 @@ $(H2 $(GNAME getLinkage))
$(LI $(D "C")) $(LI $(D "C"))
$(LI $(D "C++")) $(LI $(D "C++"))
$(LI $(D "Windows")) $(LI $(D "Windows"))
$(LI $(D "Pascal"))
$(LI $(D "Objective-C")) $(LI $(D "Objective-C"))
$(LI $(D "System")) $(LI $(D "System"))
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
extern (C) int fooc(); extern (C) int fooc();
alias aliasc = fooc; alias aliasc = fooc;
@ -665,6 +846,7 @@ static assert(__traits(getLinkage, FooCPPStruct) == "C++");
static assert(__traits(getLinkage, FooCPPClass) == "C++"); static assert(__traits(getLinkage, FooCPPClass) == "C++");
static assert(__traits(getLinkage, FooCPPInterface) == "C++"); static assert(__traits(getLinkage, FooCPPInterface) == "C++");
--- ---
)
$(H2 $(GNAME getMember)) $(H2 $(GNAME getMember))
@ -674,6 +856,7 @@ $(H2 $(GNAME getMember))
argument as an identifier. argument as an identifier.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -690,10 +873,11 @@ void main()
__traits(getMember, s, "mx") = 1; // same as s.mx=1; __traits(getMember, s, "mx") = 1; // same as s.mx=1;
writeln(__traits(getMember, s, "m" ~ "x")); // 1 writeln(__traits(getMember, s, "m" ~ "x")); // 1
__traits(getMember, S, "mx") = 1; // error, no this for S.mx // __traits(getMember, S, "mx") = 1; // error, no this for S.mx
__traits(getMember, S, "my") = 2; // ok __traits(getMember, S, "my") = 2; // ok
} }
--- ---
)
$(H2 $(GNAME getOverloads)) $(H2 $(GNAME getOverloads))
@ -705,6 +889,7 @@ $(H2 $(GNAME getOverloads))
The result is a tuple of all the overloads of the supplied name. The result is a tuple of all the overloads of the supplied name.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -736,6 +921,7 @@ void main()
writeln(t.stringof); writeln(t.stringof);
} }
--- ---
)
Prints: Prints:
@ -760,6 +946,7 @@ $(H2 $(GNAME getParameterStorageClasses))
It returns a tuple of strings representing the storage classes of that parameter. It returns a tuple of strings representing the storage classes of that parameter.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
ref int foo(return ref const int* p, scope int* a, out int b, lazy int c); ref int foo(return ref const int* p, scope int* a, out int b, lazy int c);
@ -770,6 +957,7 @@ static assert(__traits(getParameterStorageClasses, foo, 1)[0] == "scope");
static assert(__traits(getParameterStorageClasses, foo, 2)[0] == "out"); static assert(__traits(getParameterStorageClasses, foo, 2)[0] == "out");
static assert(__traits(getParameterStorageClasses, typeof(&foo), 3)[0] == "lazy"); static assert(__traits(getParameterStorageClasses, typeof(&foo), 3)[0] == "lazy");
--- ---
)
$(H2 $(GNAME getPointerBitmap)) $(H2 $(GNAME getPointerBitmap))
@ -783,29 +971,34 @@ $(H2 $(GNAME getPointerBitmap))
For type T, there are $(D T.sizeof / size_t.sizeof) possible pointers represented For type T, there are $(D T.sizeof / size_t.sizeof) possible pointers represented
by the bits of the array values.) by the bits of the array values.)
$(P This array can be used by a precise GC to avoid false pointers.) $(P This array can be used by a precise GC to avoid false pointers.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
class C void main()
{ {
// implicit virtual function table pointer not marked static class C
// implicit monitor field not marked, usually managed manually {
C next; // implicit virtual function table pointer not marked
size_t sz; // implicit monitor field not marked, usually managed manually
void* p; C next;
void function () fn; // not a GC managed pointer size_t sz;
} void* p;
void function () fn; // not a GC managed pointer
}
struct S static struct S
{ {
size_t val1; size_t val1;
void* p; void* p;
C c; C c;
byte[] arr; // { length, ptr } byte[] arr; // { length, ptr }
void delegate () dg; // { context, func } void delegate () dg; // { context, func }
} }
static assert (__traits(getPointerBitmap, C) == [6*size_t.sizeof, 0b010100]); static assert (__traits(getPointerBitmap, C) == [6*size_t.sizeof, 0b010100]);
static assert (__traits(getPointerBitmap, S) == [7*size_t.sizeof, 0b0110110]); static assert (__traits(getPointerBitmap, S) == [7*size_t.sizeof, 0b0110110]);
}
--- ---
)
$(H2 $(GNAME getProtection)) $(H2 $(GNAME getProtection))
@ -814,6 +1007,7 @@ $(H2 $(GNAME getProtection))
The result is a string giving its protection level: "public", "private", "protected", "export", or "package". The result is a string giving its protection level: "public", "private", "protected", "export", or "package".
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -834,6 +1028,7 @@ void main()
writeln(j); writeln(j);
} }
--- ---
)
Prints: Prints:
@ -842,6 +1037,28 @@ export
public public
) )
$(H2 $(GNAME getTargetInfo))
$(P Receives a string key as argument.
The result is an expression describing the requested target information.
)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
version (CppRuntime_Microsoft)
static assert(__traits(getTargetInfo, "cppRuntimeLibrary") == "libcmt");
---
)
$(P Keys are implementation defined, allowing relevant data for exotic targets.
A reliable subset exists which are always available:
)
$(UL
$(LI $(D "cppRuntimeLibrary") - The C++ runtime library affinity for this toolchain)
$(LI $(D "floatAbi") - Floating point ABI; may be $(D "hard"), $(D "soft"), or $(D "softfp"))
$(LI $(D "objectFormat") - Target object format)
)
$(H2 $(GNAME getVirtualFunctions)) $(H2 $(GNAME getVirtualFunctions))
@ -859,6 +1076,7 @@ $(H2 $(GNAME getVirtualMethods))
It does not include final functions that do not override anything. It does not include final functions that do not override anything.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -885,6 +1103,7 @@ void main()
writeln(i); writeln(i);
} }
--- ---
)
Prints: Prints:
@ -903,7 +1122,7 @@ $(H2 $(GNAME getUnitTests))
The result is a tuple of all the unit test functions of that aggregate. The result is a tuple of all the unit test functions of that aggregate.
The functions returned are like normal nested static functions, The functions returned are like normal nested static functions,
$(DDSUBLINK glossary, ctfe, CTFE) will work and $(DDSUBLINK glossary, ctfe, CTFE) will work and
$(DDSUBLINK spec/attribute, uda, UDA's) will be accessible. $(DDSUBLINK spec/attribute, uda, UDAs) will be accessible.
) )
$(H3 Note:) $(H3 Note:)
@ -914,6 +1133,7 @@ $(H2 $(GNAME getUnitTests))
empty tuple. empty tuple.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
module foo; module foo;
@ -964,6 +1184,7 @@ void main()
test(); test();
} }
--- ---
)
$(P By default, the above will print:) $(P By default, the above will print:)
@ -1010,6 +1231,7 @@ $(H2 $(GNAME allMembers))
Builtin properties are not included. Builtin properties are not included.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -1029,6 +1251,7 @@ void main()
// "Monitor", "factory"] // "Monitor", "factory"]
} }
--- ---
)
$(P The order in which the strings appear in the result $(P The order in which the strings appear in the result
is not defined.) is not defined.)
@ -1044,6 +1267,7 @@ $(H2 $(GNAME derivedMembers))
Builtin properties are not included. Builtin properties are not included.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -1061,6 +1285,7 @@ void main()
writeln(a); // ["__ctor", "__dtor", "foo"] writeln(a); // ["__ctor", "__dtor", "foo"]
} }
--- ---
)
$(P The order in which the strings appear in the result $(P The order in which the strings appear in the result
is not defined.) is not defined.)
@ -1070,6 +1295,7 @@ $(H2 $(GNAME isSame))
$(P Takes two arguments and returns bool $(D true) if they $(P Takes two arguments and returns bool $(D true) if they
are the same symbol, $(D false) if not.) are the same symbol, $(D false) if not.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -1088,6 +1314,7 @@ void main()
writeln(__traits(isSame, std, std)); // true writeln(__traits(isSame, std, std)); // true
} }
--- ---
)
$(P If the two arguments are expressions made up of literals $(P If the two arguments are expressions made up of literals
or enums that evaluate to the same value, true is returned.) or enums that evaluate to the same value, true is returned.)
@ -1173,6 +1400,7 @@ $(H2 $(GNAME compiles))
$(P If there are no arguments, the result is $(D false).) $(P If there are no arguments, the result is $(D false).)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -1199,6 +1427,7 @@ void main()
writeln(__traits(compiles, 1,2,3,int,long,3[1])); // false writeln(__traits(compiles, 1,2,3,int,long,3[1])); // false
} }
--- ---
)
$(P This is useful for:) $(P This is useful for:)

View File

@ -29,6 +29,7 @@ No name is repeated.
Builtin properties are not included. Builtin properties are not included.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -48,6 +49,7 @@ void main()
// "Monitor", "factory"] // "Monitor", "factory"]
} }
--- ---
)
$(P The order in which the strings appear in the result $(P The order in which the strings appear in the result
is not defined.)`), is not defined.)`),
@ -68,6 +70,7 @@ The arguments cannot be statements or declarations.
$(P If there are no arguments, the result is $(D false).) $(P If there are no arguments, the result is $(D false).)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -94,6 +97,7 @@ void main()
writeln(__traits(compiles, 1,2,3,int,long,3[1])); // false writeln(__traits(compiles, 1,2,3,int,long,3[1])); // false
} }
--- ---
)
$(P This is useful for:) $(P This is useful for:)
@ -112,6 +116,7 @@ Base class member names are not included.
Builtin properties are not included. Builtin properties are not included.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -129,23 +134,48 @@ void main()
writeln(a); // ["__ctor", "__dtor", "foo"] writeln(a); // ["__ctor", "__dtor", "foo"]
} }
--- ---
)
$(P The order in which the strings appear in the result $(P The order in which the strings appear in the result
is not defined.)`), is not defined.)`),
ConstantCompletion("getAliasThis", `$(P Takes one argument, a symbol of aggregate type. ConstantCompletion("getAliasThis", `$(P Takes one argument, a type. If the type has ` ~ "`" ~ `alias this` ~ "`" ~ ` declarations,
If the given aggregate type has $(D alias this), returns a list of returns a sequence of the names (as ` ~ "`" ~ `string` ~ "`" ~ `s) of the members used in
$(D alias this) names, by a tuple of $(D string)s. those declarations. Otherwise returns an empty sequence.
Otherwise returns an empty tuple. )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
alias AliasSeq(T...) = T;
struct S1
{
string var;
alias var this;
}
static assert(__traits(getAliasThis, S1) == AliasSeq!("var"));
static assert(__traits(getAliasThis, int).length == 0);
pragma(msg, __traits(getAliasThis, S1));
pragma(msg, __traits(getAliasThis, int));
---
)
Prints:
$(CONSOLE
tuple("var")
tuple()
)`), )`),
ConstantCompletion("getAttributes", `$(P ConstantCompletion("getAttributes", `$(P
Takes one argument, a symbol. Returns a tuple of all attached user-defined attributes. Takes one argument, a symbol. Returns a tuple of all attached user-defined attributes.
If no UDA's exist it will return an empty tuple. If no UDAs exist it will return an empty tuple.
) )
$(P $(P
For more information, see: $(DDSUBLINK spec/attribute, uda, User-Defined Attributes) For more information, see: $(DDSUBLINK spec/attribute, uda, User-Defined Attributes)
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
@(3) int a; @(3) int a;
@("string", 7) int b; @("string", 7) int b;
@ -157,6 +187,7 @@ pragma(msg, __traits(getAttributes, a));
pragma(msg, __traits(getAttributes, b)); pragma(msg, __traits(getAttributes, b));
pragma(msg, __traits(getAttributes, c)); pragma(msg, __traits(getAttributes, c));
--- ---
)
Prints: Prints:
@ -189,10 +220,10 @@ tuple((Foo))
For example: For example:
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
int sum(int x, int y) pure nothrow { return x + y; } int sum(int x, int y) pure nothrow { return x + y; }
// prints ("pure", "nothrow", "@system")
pragma(msg, __traits(getFunctionAttributes, sum)); pragma(msg, __traits(getFunctionAttributes, sum));
struct S struct S
@ -200,16 +231,35 @@ struct S
void test() const @system { } void test() const @system { }
} }
// prints ("const", "@system")
pragma(msg, __traits(getFunctionAttributes, S.test)); pragma(msg, __traits(getFunctionAttributes, S.test));
void main(){}
--- ---
)
Prints:
$(CONSOLE
tuple("pure", "nothrow", "@system")
tuple("const", "@system")
)
$(P Note that some attributes can be inferred. For example:) $(P Note that some attributes can be inferred. For example:)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
// prints ("pure", "nothrow", "@nogc", "@trusted")
pragma(msg, __traits(getFunctionAttributes, (int x) @trusted { return x * 2; })); pragma(msg, __traits(getFunctionAttributes, (int x) @trusted { return x * 2; }));
void main(){}
--- ---
)
Prints:
$(CONSOLE
tuple("pure", "nothrow", "@nogc", "@trusted")
)
)
)`), )`),
ConstantCompletion("getFunctionVariadicStyle", `$(P ConstantCompletion("getFunctionVariadicStyle", `$(P
Takes one argument which must either be a function symbol, or a type Takes one argument which must either be a function symbol, or a type
@ -226,6 +276,7 @@ $(TABLE2 getFunctionVariadicStyle,
$(TROW $(D "typesafe"), typesafe variadic function, array on stack, $(D void def(int[] ...))) $(TROW $(D "typesafe"), typesafe variadic function, array on stack, $(D void def(int[] ...)))
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import core.stdc.stdarg; import core.stdc.stdarg;
@ -244,6 +295,7 @@ static assert(__traits(getFunctionVariadicStyle, typesafe) == "typesafe");
static assert(__traits(getFunctionVariadicStyle, (int[] a...) {}) == "typesafe"); static assert(__traits(getFunctionVariadicStyle, (int[] a...) {}) == "typesafe");
static assert(__traits(getFunctionVariadicStyle, typeof(cstyle)) == "stdarg"); static assert(__traits(getFunctionVariadicStyle, typeof(cstyle)) == "stdarg");
--- ---
)
)`), )`),
ConstantCompletion("getLinkage", `$(P Takes one argument, which is a declaration symbol, or the type of a function, delegate, ConstantCompletion("getLinkage", `$(P Takes one argument, which is a declaration symbol, or the type of a function, delegate,
pointer to function, struct, class, or interface. pointer to function, struct, class, or interface.
@ -257,11 +309,11 @@ $(LI $(D "D"))
$(LI $(D "C")) $(LI $(D "C"))
$(LI $(D "C++")) $(LI $(D "C++"))
$(LI $(D "Windows")) $(LI $(D "Windows"))
$(LI $(D "Pascal"))
$(LI $(D "Objective-C")) $(LI $(D "Objective-C"))
$(LI $(D "System")) $(LI $(D "System"))
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
extern (C) int fooc(); extern (C) int fooc();
alias aliasc = fooc; alias aliasc = fooc;
@ -276,13 +328,15 @@ extern (C++) interface FooCPPInterface {}
static assert(__traits(getLinkage, FooCPPStruct) == "C++"); static assert(__traits(getLinkage, FooCPPStruct) == "C++");
static assert(__traits(getLinkage, FooCPPClass) == "C++"); static assert(__traits(getLinkage, FooCPPClass) == "C++");
static assert(__traits(getLinkage, FooCPPInterface) == "C++"); static assert(__traits(getLinkage, FooCPPInterface) == "C++");
---`), ---
)`),
ConstantCompletion("getMember", `$(P Takes two arguments, the second must be a string. ConstantCompletion("getMember", `$(P Takes two arguments, the second must be a string.
The result is an expression formed from the first The result is an expression formed from the first
argument, followed by a $(SINGLEQUOTE .), followed by the second argument, followed by a $(SINGLEQUOTE .), followed by the second
argument as an identifier. argument as an identifier.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -299,10 +353,11 @@ void main()
__traits(getMember, s, "mx") = 1; // same as s.mx=1; __traits(getMember, s, "mx") = 1; // same as s.mx=1;
writeln(__traits(getMember, s, "m" ~ "x")); // 1 writeln(__traits(getMember, s, "m" ~ "x")); // 1
__traits(getMember, S, "mx") = 1; // error, no this for S.mx // __traits(getMember, S, "mx") = 1; // error, no this for S.mx
__traits(getMember, S, "my") = 2; // ok __traits(getMember, S, "my") = 2; // ok
} }
---`), ---
)`),
ConstantCompletion("getOverloads", `$(P The first argument is an aggregate (e.g. struct/class/module). ConstantCompletion("getOverloads", `$(P The first argument is an aggregate (e.g. struct/class/module).
The second argument is a ` ~ "`" ~ `string` ~ "`" ~ ` that matches the name of The second argument is a ` ~ "`" ~ `string` ~ "`" ~ ` that matches the name of
the member(s) to return. the member(s) to return.
@ -311,6 +366,7 @@ result will also include template overloads.
The result is a tuple of all the overloads of the supplied name. The result is a tuple of all the overloads of the supplied name.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -342,6 +398,7 @@ void main()
writeln(t.stringof); writeln(t.stringof);
} }
--- ---
)
Prints: Prints:
@ -363,6 +420,7 @@ bar(int n)
It returns a tuple of strings representing the storage classes of that parameter. It returns a tuple of strings representing the storage classes of that parameter.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
ref int foo(return ref const int* p, scope int* a, out int b, lazy int c); ref int foo(return ref const int* p, scope int* a, out int b, lazy int c);
@ -372,7 +430,8 @@ static assert(__traits(getParameterStorageClasses, foo, 0)[1] == "ref");
static assert(__traits(getParameterStorageClasses, foo, 1)[0] == "scope"); static assert(__traits(getParameterStorageClasses, foo, 1)[0] == "scope");
static assert(__traits(getParameterStorageClasses, foo, 2)[0] == "out"); static assert(__traits(getParameterStorageClasses, foo, 2)[0] == "out");
static assert(__traits(getParameterStorageClasses, typeof(&foo), 3)[0] == "lazy"); static assert(__traits(getParameterStorageClasses, typeof(&foo), 3)[0] == "lazy");
---`), ---
)`),
ConstantCompletion("getPointerBitmap", `$(P The argument is a type. ConstantCompletion("getPointerBitmap", `$(P The argument is a type.
The result is an array of $(D size_t) describing the memory used by an instance of the given type. The result is an array of $(D size_t) describing the memory used by an instance of the given type.
) )
@ -383,33 +442,39 @@ memory occupied by an instance of the type.
For type T, there are $(D T.sizeof / size_t.sizeof) possible pointers represented For type T, there are $(D T.sizeof / size_t.sizeof) possible pointers represented
by the bits of the array values.) by the bits of the array values.)
$(P This array can be used by a precise GC to avoid false pointers.) $(P This array can be used by a precise GC to avoid false pointers.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
class C void main()
{ {
// implicit virtual function table pointer not marked static class C
// implicit monitor field not marked, usually managed manually {
C next; // implicit virtual function table pointer not marked
size_t sz; // implicit monitor field not marked, usually managed manually
void* p; C next;
void function () fn; // not a GC managed pointer size_t sz;
} void* p;
void function () fn; // not a GC managed pointer
}
struct S static struct S
{ {
size_t val1; size_t val1;
void* p; void* p;
C c; C c;
byte[] arr; // { length, ptr } byte[] arr; // { length, ptr }
void delegate () dg; // { context, func } void delegate () dg; // { context, func }
} }
static assert (__traits(getPointerBitmap, C) == [6*size_t.sizeof, 0b010100]); static assert (__traits(getPointerBitmap, C) == [6*size_t.sizeof, 0b010100]);
static assert (__traits(getPointerBitmap, S) == [7*size_t.sizeof, 0b0110110]); static assert (__traits(getPointerBitmap, S) == [7*size_t.sizeof, 0b0110110]);
---`), }
---
)`),
ConstantCompletion("getProtection", `$(P The argument is a symbol. ConstantCompletion("getProtection", `$(P The argument is a symbol.
The result is a string giving its protection level: "public", "private", "protected", "export", or "package". The result is a string giving its protection level: "public", "private", "protected", "export", or "package".
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -430,19 +495,40 @@ void main()
writeln(j); writeln(j);
} }
--- ---
)
Prints: Prints:
$(CONSOLE $(CONSOLE
export export
public public
)`),
ConstantCompletion("getTargetInfo", `$(P Receives a string key as argument.
The result is an expression describing the requested target information.
)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
version (CppRuntime_Microsoft)
static assert(__traits(getTargetInfo, "cppRuntimeLibrary") == "libcmt");
---
)
$(P Keys are implementation defined, allowing relevant data for exotic targets.
A reliable subset exists which are always available:
)
$(UL
$(LI $(D "cppRuntimeLibrary") - The C++ runtime library affinity for this toolchain)
$(LI $(D "floatAbi") - Floating point ABI; may be $(D "hard"), $(D "soft"), or $(D "softfp"))
$(LI $(D "objectFormat") - Target object format)
)`), )`),
ConstantCompletion("getUnitTests", `$(P ConstantCompletion("getUnitTests", `$(P
Takes one argument, a symbol of an aggregate (e.g. struct/class/module). Takes one argument, a symbol of an aggregate (e.g. struct/class/module).
The result is a tuple of all the unit test functions of that aggregate. The result is a tuple of all the unit test functions of that aggregate.
The functions returned are like normal nested static functions, The functions returned are like normal nested static functions,
$(DDSUBLINK glossary, ctfe, CTFE) will work and $(DDSUBLINK glossary, ctfe, CTFE) will work and
$(DDSUBLINK spec/attribute, uda, UDA's) will be accessible. $(DDSUBLINK spec/attribute, uda, UDAs) will be accessible.
) )
$(H3 Note:) $(H3 Note:)
@ -453,6 +539,7 @@ $(P
empty tuple. empty tuple.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
module foo; module foo;
@ -503,6 +590,7 @@ void main()
test(); test();
} }
--- ---
)
$(P By default, the above will print:) $(P By default, the above will print:)
@ -528,6 +616,7 @@ The result is a tuple of the virtual overloads of that function.
It does not include final functions that do not override anything. It does not include final functions that do not override anything.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -554,6 +643,7 @@ void main()
writeln(i); writeln(i);
} }
--- ---
)
Prints: Prints:
@ -571,6 +661,7 @@ If the string is a valid property of the type,
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -591,10 +682,12 @@ void main()
writeln(__traits(hasMember, S, "write")); // true writeln(__traits(hasMember, S, "write")); // true
writeln(__traits(hasMember, int, "sizeof")); // true writeln(__traits(hasMember, int, "sizeof")); // true
} }
---`), ---
)`),
ConstantCompletion("identifier", `$(P Takes one argument, a symbol. Returns the identifier ConstantCompletion("identifier", `$(P Takes one argument, a symbol. Returns the identifier
for that symbol as a string literal. for that symbol as a string literal.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -603,13 +696,15 @@ pragma(msg, typeof(var)); // int
pragma(msg, typeof(__traits(identifier, var))); // string pragma(msg, typeof(__traits(identifier, var))); // string
writeln(var); // 123 writeln(var); // 123
writeln(__traits(identifier, var)); // "var" writeln(__traits(identifier, var)); // "var"
---`), ---
)`),
ConstantCompletion("isAbstractClass", `$(P If the arguments are all either types that are abstract classes, ConstantCompletion("isAbstractClass", `$(P If the arguments are all either types that are abstract classes,
or expressions that are typed as abstract classes, then $(D true) or expressions that are typed as abstract classes, then $(D true)
is returned. is returned.
Otherwise, $(D false) is returned. Otherwise, $(D false) is returned.
If there are no arguments, $(D false) is returned.) If there are no arguments, $(D false) is returned.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -624,6 +719,7 @@ void main()
writeln(__traits(isAbstractClass, int*)); writeln(__traits(isAbstractClass, int*));
} }
--- ---
)
Prints: Prints:
@ -637,6 +733,7 @@ false
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -661,13 +758,15 @@ void main()
writeln(__traits(isAbstractFunction, S.bar)); // false writeln(__traits(isAbstractFunction, S.bar)); // false
writeln(__traits(isAbstractFunction, AC.foo)); // true writeln(__traits(isAbstractFunction, AC.foo)); // true
} }
---`), ---
)`),
ConstantCompletion("isArithmetic", `$(P If the arguments are all either types that are arithmetic types, ConstantCompletion("isArithmetic", `$(P If the arguments are all either types that are arithmetic types,
or expressions that are typed as arithmetic types, then $(D true) or expressions that are typed as arithmetic types, then $(D true)
is returned. is returned.
Otherwise, $(D false) is returned. Otherwise, $(D false) is returned.
If there are no arguments, $(D false) is returned.) If there are no arguments, $(D false) is returned.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -680,6 +779,7 @@ void main()
writeln(__traits(isArithmetic, int*)); writeln(__traits(isArithmetic, int*));
} }
--- ---
)
Prints: Prints:
@ -696,6 +796,7 @@ marked with the ` ~ "`" ~ `deprecated` ~ "`" ~ ` keyword, otherwise ` ~ "`" ~ `f
ConstantCompletion("isDisabled", `$(P Takes one argument and returns ` ~ "`" ~ `true` ~ "`" ~ ` if it's a function declaration ConstantCompletion("isDisabled", `$(P Takes one argument and returns ` ~ "`" ~ `true` ~ "`" ~ ` if it's a function declaration
marked with ` ~ "`" ~ `@disable` ~ "`" ~ `.) marked with ` ~ "`" ~ `@disable` ~ "`" ~ `.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
struct Foo struct Foo
{ {
@ -706,21 +807,25 @@ struct Foo
static assert(__traits(isDisabled, Foo.foo)); static assert(__traits(isDisabled, Foo.foo));
static assert(!__traits(isDisabled, Foo.bar)); static assert(!__traits(isDisabled, Foo.bar));
--- ---
)
$(P For any other declaration even if ` ~ "`" ~ `@disable` ~ "`" ~ ` is a syntactically valid $(P For any other declaration even if ` ~ "`" ~ `@disable` ~ "`" ~ ` is a syntactically valid
attribute ` ~ "`" ~ `false` ~ "`" ~ ` is returned because the annotation has no effect.) attribute ` ~ "`" ~ `false` ~ "`" ~ ` is returned because the annotation has no effect.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
@disable struct Bar{} @disable struct Bar{}
static assert(!__traits(isDisabled, Bar)); static assert(!__traits(isDisabled, Bar));
---`), ---
)`),
ConstantCompletion("isFinalClass", `$(P Works like $(D isAbstractClass), except it's for final ConstantCompletion("isFinalClass", `$(P Works like $(D isAbstractClass), except it's for final
classes.)`), classes.)`),
ConstantCompletion("isFinalFunction", `$(P Takes one argument. If that argument is a final function, ConstantCompletion("isFinalFunction", `$(P Takes one argument. If that argument is a final function,
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -747,19 +852,55 @@ void main()
writeln(__traits(isFinalFunction, C.foo)); // true writeln(__traits(isFinalFunction, C.foo)); // true
writeln(__traits(isFinalFunction, FC.foo)); // true writeln(__traits(isFinalFunction, FC.foo)); // true
} }
---`), ---
)`),
ConstantCompletion("isFloating", `$(P Works like $(D isArithmetic), except it's for floating ConstantCompletion("isFloating", `$(P Works like $(D isArithmetic), except it's for floating
point types (including imaginary and complex types).)`), point types (including imaginary and complex types).)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : float4;
enum E : float { a, b }
static assert(__traits(isFloating, float));
static assert(__traits(isFloating, idouble));
static assert(__traits(isFloating, creal));
static assert(__traits(isFloating, E));
static assert(__traits(isFloating, float4));
static assert(!__traits(isFloating, float[4]));
---
)`),
ConstantCompletion("isFuture", `$(P Takes one argument. It returns ` ~ "`" ~ `true` ~ "`" ~ ` if the argument is a symbol ConstantCompletion("isFuture", `$(P Takes one argument. It returns ` ~ "`" ~ `true` ~ "`" ~ ` if the argument is a symbol
marked with the ` ~ "`" ~ `@future` ~ "`" ~ ` keyword, otherwise ` ~ "`" ~ `false` ~ "`" ~ `. Currently, only marked with the ` ~ "`" ~ `@future` ~ "`" ~ ` keyword, otherwise ` ~ "`" ~ `false` ~ "`" ~ `. Currently, only
functions and variable declarations have support for the ` ~ "`" ~ `@future` ~ "`" ~ ` keyword.)`), functions and variable declarations have support for the ` ~ "`" ~ `@future` ~ "`" ~ ` keyword.)`),
ConstantCompletion("isIntegral", `$(P Works like $(D isArithmetic), except it's for integral ConstantCompletion("isIntegral", `$(P Works like $(D isArithmetic), except it's for integral
types (including character types).)`), types (including character types).)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : int4;
enum E { a, b }
static assert(__traits(isIntegral, bool));
static assert(__traits(isIntegral, char));
static assert(__traits(isIntegral, int));
static assert(__traits(isIntegral, E));
static assert(__traits(isIntegral, int4));
static assert(!__traits(isIntegral, float));
static assert(!__traits(isIntegral, int[4]));
static assert(!__traits(isIntegral, void*));
---
)`),
ConstantCompletion("isLazy", `$(P Takes one argument. If that argument is a declaration, ConstantCompletion("isLazy", `$(P Takes one argument. If that argument is a declaration,
$(D true) is returned if it is $(D_KEYWORD ref), $(D_KEYWORD out), $(D true) is returned if it is $(D_KEYWORD ref), $(D_KEYWORD out),
or $(D_KEYWORD lazy), otherwise $(D false). or $(D_KEYWORD lazy), otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
void fooref(ref int x) void fooref(ref int x)
{ {
@ -781,7 +922,8 @@ void foolazy(lazy int x)
static assert(!__traits(isOut, x)); static assert(!__traits(isOut, x));
static assert(__traits(isLazy, x)); static assert(__traits(isLazy, x));
} }
---`), ---
)`),
ConstantCompletion("isNested", `$(P Takes one argument. ConstantCompletion("isNested", `$(P Takes one argument.
It returns $(D true) if the argument is a nested type which internally It returns $(D true) if the argument is a nested type which internally
stores a context pointer, otherwise it returns $(D false). stores a context pointer, otherwise it returns $(D false).
@ -793,6 +935,7 @@ $(D true) is returned if it is $(D_KEYWORD ref), $(D_KEYWORD out),
or $(D_KEYWORD lazy), otherwise $(D false). or $(D_KEYWORD lazy), otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
void fooref(ref int x) void fooref(ref int x)
{ {
@ -814,11 +957,13 @@ void foolazy(lazy int x)
static assert(!__traits(isOut, x)); static assert(!__traits(isOut, x));
static assert(__traits(isLazy, x)); static assert(__traits(isLazy, x));
} }
---`), ---
)`),
ConstantCompletion("isOverrideFunction", `$(P Takes one argument. If that argument is a function marked with ConstantCompletion("isOverrideFunction", `$(P Takes one argument. If that argument is a function marked with
$(D_KEYWORD override), $(D true) is returned, otherwise $(D false). $(D_KEYWORD override), $(D true) is returned, otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -839,7 +984,8 @@ void main()
writeln(__traits(isOverrideFunction, Foo.foo)); // true writeln(__traits(isOverrideFunction, Foo.foo)); // true
writeln(__traits(isOverrideFunction, Foo.bar)); // false writeln(__traits(isOverrideFunction, Foo.bar)); // false
} }
---`), ---
)`),
ConstantCompletion("isPOD", `$(P Takes one argument, which must be a type. It returns ConstantCompletion("isPOD", `$(P Takes one argument, which must be a type. It returns
$(D true) if the type is a $(DDSUBLINK glossary, pod, POD) type, otherwise $(D false).)`), $(D true) if the type is a $(DDSUBLINK glossary, pod, POD) type, otherwise $(D false).)`),
ConstantCompletion("isRef", `$(P Takes one argument. If that argument is a declaration, ConstantCompletion("isRef", `$(P Takes one argument. If that argument is a declaration,
@ -847,6 +993,7 @@ $(D true) is returned if it is $(D_KEYWORD ref), $(D_KEYWORD out),
or $(D_KEYWORD lazy), otherwise $(D false). or $(D_KEYWORD lazy), otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
void fooref(ref int x) void fooref(ref int x)
{ {
@ -868,7 +1015,8 @@ void foolazy(lazy int x)
static assert(!__traits(isOut, x)); static assert(!__traits(isOut, x));
static assert(__traits(isLazy, x)); static assert(__traits(isLazy, x));
} }
---`), ---
)`),
ConstantCompletion("isReturnOnStack", `$(P ConstantCompletion("isReturnOnStack", `$(P
Takes one argument which must either be a function symbol, function literal, Takes one argument which must either be a function symbol, function literal,
a delegate, or a function pointer. a delegate, or a function pointer.
@ -877,6 +1025,7 @@ void foolazy(lazy int x)
parameter to the function. parameter to the function.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
struct S { int[20] a; } struct S { int[20] a; }
int test1(); int test1();
@ -885,6 +1034,7 @@ S test2();
static assert(__traits(isReturnOnStack, test1) == false); static assert(__traits(isReturnOnStack, test1) == false);
static assert(__traits(isReturnOnStack, test2) == true); static assert(__traits(isReturnOnStack, test2) == true);
--- ---
)
$(IMPLEMENTATION_DEFINED $(IMPLEMENTATION_DEFINED
This is determined by the function ABI calling convention in use, This is determined by the function ABI calling convention in use,
@ -902,6 +1052,7 @@ this enables efficient, direct, and simple testing.)
ConstantCompletion("isSame", `$(P Takes two arguments and returns bool $(D true) if they ConstantCompletion("isSame", `$(P Takes two arguments and returns bool $(D true) if they
are the same symbol, $(D false) if not.) are the same symbol, $(D false) if not.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -920,6 +1071,7 @@ void main()
writeln(__traits(isSame, std, std)); // true writeln(__traits(isSame, std, std)); // true
} }
--- ---
)
$(P If the two arguments are expressions made up of literals $(P If the two arguments are expressions made up of literals
or enums that evaluate to the same value, true is returned.) or enums that evaluate to the same value, true is returned.)
@ -994,25 +1146,102 @@ void main()
--- ---
)`), )`),
ConstantCompletion("isScalar", `$(P Works like $(D isArithmetic), except it's for scalar ConstantCompletion("isScalar", `$(P Works like $(D isArithmetic), except it's for scalar
types.)`), types.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : int4, void16;
enum E { a, b }
static assert(__traits(isScalar, bool));
static assert(__traits(isScalar, char));
static assert(__traits(isScalar, int));
static assert(__traits(isScalar, float));
static assert(__traits(isScalar, E));
static assert(__traits(isScalar, int4));
static assert(__traits(isScalar, void*)); // Includes pointers!
static assert(!__traits(isScalar, int[4]));
static assert(!__traits(isScalar, void16));
static assert(!__traits(isScalar, void));
static assert(!__traits(isScalar, typeof(null)));
static assert(!__traits(isScalar, Object));
---
)`),
ConstantCompletion("isStaticArray", `$(P Works like $(D isArithmetic), except it's for static array ConstantCompletion("isStaticArray", `$(P Works like $(D isArithmetic), except it's for static array
types.)`), types.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : int4;
enum E : int[4] { a = [1, 2, 3, 4] }
static array = [1, 2, 3]; // Not a static array: the type is inferred as int[] not int[3].
static assert(__traits(isStaticArray, void[0]));
static assert(__traits(isStaticArray, E));
static assert(!__traits(isStaticArray, int4));
static assert(!__traits(isStaticArray, array));
---
)`),
ConstantCompletion("isStaticFunction", `$(P Takes one argument. If that argument is a static function, ConstantCompletion("isStaticFunction", `$(P Takes one argument. If that argument is a static function,
meaning it has no context pointer, meaning it has no context pointer,
$(D true) is returned, otherwise $(D false). $(D true) is returned, otherwise $(D false).
)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
struct A
{
int foo() { return 3; }
static int boo(int a) { return a; }
}
void main()
{
assert(__traits(isStaticFunction, A.boo));
assert(!__traits(isStaticFunction, A.foo));
assert(__traits(isStaticFunction, main));
}
---
)`), )`),
ConstantCompletion("isTemplate", `$(P Takes one argument. If that argument is a template then $(D true) is returned, ConstantCompletion("isTemplate", `$(P Takes one argument. If that argument is a template then $(D true) is returned,
otherwise $(D false). otherwise $(D false).
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
void foo(T)(){} void foo(T)(){}
static assert(__traits(isTemplate,foo)); static assert(__traits(isTemplate,foo));
static assert(!__traits(isTemplate,foo!int())); static assert(!__traits(isTemplate,foo!int()));
static assert(!__traits(isTemplate,"string")); static assert(!__traits(isTemplate,"string"));
---`), ---
)`),
ConstantCompletion("isUnsigned", `$(P Works like $(D isArithmetic), except it's for unsigned ConstantCompletion("isUnsigned", `$(P Works like $(D isArithmetic), except it's for unsigned
types.)`), types.)
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
---
import core.simd : uint4;
enum SignedEnum { a, b }
enum UnsignedEnum : uint { a, b }
static assert(__traits(isUnsigned, bool));
static assert(__traits(isUnsigned, char));
static assert(__traits(isUnsigned, uint));
static assert(__traits(isUnsigned, UnsignedEnum));
static assert(__traits(isUnsigned, uint4));
static assert(!__traits(isUnsigned, int));
static assert(!__traits(isUnsigned, float));
static assert(!__traits(isUnsigned, SignedEnum));
static assert(!__traits(isUnsigned, uint[4]));
static assert(!__traits(isUnsigned, void*));
---
)`),
ConstantCompletion("isVirtualFunction", `$(P The same as $(GLINK isVirtualMethod), except ConstantCompletion("isVirtualFunction", `$(P The same as $(GLINK isVirtualMethod), except
that final functions that don't override anything return true. that final functions that don't override anything return true.
)`), )`),
@ -1021,6 +1250,7 @@ $(D true) is returned, otherwise $(D false).
Final functions that don't override anything return false. Final functions that don't override anything return false.
) )
$(SPEC_RUNNABLE_EXAMPLE_COMPILE
--- ---
import std.stdio; import std.stdio;
@ -1039,7 +1269,8 @@ void main()
writeln(__traits(isVirtualMethod, C.bar)); // true writeln(__traits(isVirtualMethod, C.bar)); // true
writeln(__traits(isVirtualMethod, S.bar)); // false writeln(__traits(isVirtualMethod, S.bar)); // false
} }
---`), ---
)`),
ConstantCompletion("isZeroInit", `$(P Takes one argument which must be a type. If the type's ConstantCompletion("isZeroInit", `$(P Takes one argument which must be a type. If the type's
$(DDSUBLINK spec/property, init, default initializer) is all zero $(DDSUBLINK spec/property, init, default initializer) is all zero
bits then ` ~ "`" ~ `true` ~ "`" ~ ` is returned, otherwise ` ~ "`" ~ `false` ~ "`" ~ `.) bits then ` ~ "`" ~ `true` ~ "`" ~ ` is returned, otherwise ` ~ "`" ~ `false` ~ "`" ~ `.)

View File

@ -13,6 +13,7 @@ getOverloads k
getParameterStorageClasses k getParameterStorageClasses k
getPointerBitmap k getPointerBitmap k
getProtection k getProtection k
getTargetInfo k
getUnitTests k getUnitTests k
getVirtualFunctions k getVirtualFunctions k
getVirtualIndex k getVirtualIndex k