April 21 [Issue 24516] New: qualifiers lost when tupleof is aliased | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=24516 Issue ID: 24516 Summary: qualifiers lost when tupleof is aliased Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody@puremagic.com Reporter: issues.dlang@jmdavisProg.com When tupleof is used on a const type, the types of the resulting symbols are const. However, if the result of tupleof is aliased (either directly within a function or inside an eponymous template), then the constness is lost. --- void main() { import std.meta : AliasSeq; static struct S { int i; int* ptr; string str; } static assert(is(typeof(S.tupleof) == AliasSeq!(int, int*, string))); static assert(is(typeof(const(S).tupleof) == AliasSeq!(const int, const int*, const string))); alias CS = const S; static assert(is(typeof(CS.tupleof) == AliasSeq!(const int, const int*, const string))); alias Symbols = S.tupleof; alias ConstSymbols = CS.tupleof; static assert(is(typeof(Symbols) == AliasSeq!(int, int*, string))); // fails static assert(is(typeof(ConstSymbols) == AliasSeq!(const int, const int*, const string))); static assert(is(typeof(FieldSymbols!S) == AliasSeq!(int, int*, string))); // fails static assert(is(typeof(FieldSymbols!(const S)) == AliasSeq!(const int, const int*, const string))); } template FieldSymbols(T) { alias FieldSymbols = T.tupleof; } --- The lines that are marked with // fails result in --- test.d(22): Error: static assert: `is((int, int*, string) == (const(int), const(int*), const(string)))` is false --- indicating that the constness was lost when the result of tupleof was aliased. -- |
Copyright © 1999-2021 by the D Language Foundation