Qualify some function parameters under std.conv as const to reduce te…#8251
Qualify some function parameters under std.conv as const to reduce te…#8251nordlow wants to merge 4 commits intodlang:masterfrom
Conversation
|
Thanks for your pull request and interest in making D better, @nordlow! We are looking forward to reviewing it, and you should be hearing from a maintainer soon.
Please see CONTRIBUTING.md for more information. If you have addressed all reviews or aren't sure how to proceed, don't hesitate to ping us with a simple comment. Bugzilla referencesYour PR doesn't reference any Bugzilla issue. If your PR contains non-trivial changes, please reference a Bugzilla issue or create a manual changelog. Testing this PR locallyIf you don't have a local development environment setup, you can use Digger to test this PR: dub run digger -- build "master + phobos#8251" |
|
@nordlow unit-threaded fails to compile with this change: |
I can't make sense of why this fails. This passes when I change const(T) argsto const T argsUnfortunately using Update: This describes the reduced cases: class C {}
struct S
{
C c; // all calls pass when we qualify this as const
}
void test() {
S m;
const S c;
void f(T...)(const(T) t)
{
}
static assert( __traits(compiles, { f(m, m); }));
static assert(!__traits(compiles, { f(m, c); }));
static assert(!__traits(compiles, { f(c, m); }));
static assert(!__traits(compiles, { f(c, c); }));
}I'm surprised this isn't covered by Phobos unittests. Is this a compiler bug, @maxhaton @andralex? |
Indeed. static struct Range
{
int counter = 0;
@safe pure nothrow @nogc:
bool empty() const => (counter <= 0);
int front() const => counter;
void popFront() { --counter; }
}
auto m = Range(2);… would get printed as |
|
CI failures are expected; this patch is still flawed. |
|
Having had a glimpse at https://github.com/dlang/phobos/pull/8591/files#diff-0cefbc614b4b0ed8ef2e594905dddb131963e859be1af0068c9bb5b7b129ba89, I suppose this won’t be solvable realistically – right? |
|
No, this is not solvable—not even in principle. In general, if a use passes a value of an arbitrary type into generic code, and the generic code wants to use that value to call other functions/methods, it must preserve the exact type (including qualifiers) of the value in order to call the correct overload(s). |
|
Phantom-zoning this. |
…mplate bloat
Trivial review, @thewilsonator.