Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
March 14, 2020 Why can't the compiler properly detect the type of Array!string("something")? | ||||
---|---|---|---|---|
| ||||
In the following code the compiler says the type is Array!()(string): if (key in wordTable) wordTable[key] ~= word; else wordTable[key] = Array!string(word); source/app.d(29,36): Error: template std.container.array.Array!string.Array.__ctor cannot deduce functi on from argument types !()(string), candidates are: /snap/dmd/99/bin/../import/phobos/std/container/array.d(467,5): __ctor(U)(U[] values...) with U = immutable(char) must satisfy the following constraint: isImplicitlyConvertible!(U, T) /snap/dmd/99/bin/../import/phobos/std/container/array.d(501,5): __ctor(Range)(Range r) with Range = string must satisfy the following constraint: isImplicitlyConvertible!(ElementType!Range, T) |
March 14, 2020 Re: Why can't the compiler properly detect the type of Array!string("something")? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adnan | On Saturday, 14 March 2020 at 23:39:11 UTC, Adnan wrote:
> In the following code the compiler says the type is Array!()(string):
>
> if (key in wordTable)
> wordTable[key] ~= word;
> else
> wordTable[key] = Array!string(word);
>
>
> source/app.d(29,36): Error: template std.container.array.Array!string.Array.__ctor cannot deduce functi
> on from argument types !()(string), candidates are:
> /snap/dmd/99/bin/../import/phobos/std/container/array.d(467,5):
> __ctor(U)(U[] values...)
> with U = immutable(char)
> must satisfy the following constraint:
> isImplicitlyConvertible!(U, T)
> /snap/dmd/99/bin/../import/phobos/std/container/array.d(501,5):
> __ctor(Range)(Range r)
> with Range = string
> must satisfy the following constraint:
> isImplicitlyConvertible!(ElementType!Range, T)
Full code
string smallestRepr(const string arg) {
auto repeated = arg ~ arg;
string result = arg;
foreach (i; 1 .. arg.length) {
const slice = repeated[i .. i + arg.length];
if (slice < result)
result = slice;
}
return result;
}
unittest {
assert("cba".smallestRepr() == "acb");
}
void main(const string[] args) {
import std.stdio : write, File;
import std.container : Array;
Array!string[string] wordTable;
foreach (string word; File(args[1]).byLineCopy()) {
word = word[0 .. $ - 1]; // strip the newline character
const string key = word.smallestRepr();
debug {
if (key in wordTable)
wordTable[key] ~= word;
else
wordTable[key] = Array!string(word);
}
else {
wordTable.require(key, Array!string()) ~= word;
}
}
foreach (array; wordTable.values) {
if (array.length == 4) {
foreach (word; array) {
write(word, ", ");
}
write("\n");
break;
}
}
}
|
March 14, 2020 Re: Why can't the compiler properly detect the type of Array!string("something")? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adnan | On Saturday, 14 March 2020 at 23:39:11 UTC, Adnan wrote:
> Full code
this worked for me when i copy/pasted it... are you sure that has the error? if so what compiler version you on?
|
March 15, 2020 Re: Why can't the compiler properly detect the type of Array!string("something")? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Saturday, 14 March 2020 at 23:54:44 UTC, Adam D. Ruppe wrote: > On Saturday, 14 March 2020 at 23:39:11 UTC, Adnan wrote: >> Full code > > this worked for me when i copy/pasted it... are you sure that has the error? if so what compiler version you on? This is indeed very strange, godbolt says it's alright: https://d.godbolt.org/z/DaaPxX Now my compiler version: $ dmd --version && ldc2 --version DMD64 D Compiler v2.090.0 Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved written by Walter Bright LDC - the LLVM D compiler (1.18.0): based on DMD v2.088.1 and LLVM 9.0.0 built with LDC - the LLVM D compiler (1.18.0) Default target: x86_64-unknown-linux-gnu Host CPU: znver1 http://dlang.org - http://wiki.dlang.org/LDC Registered Targets: aarch64 - AArch64 (little endian) aarch64_32 - AArch64 (little endian ILP32) aarch64_be - AArch64 (big endian) arm - ARM arm64 - ARM64 (little endian) arm64_32 - ARM64 (little endian ILP32) armeb - ARM (big endian) mips - MIPS (32-bit big endian) mips64 - MIPS (64-bit big endian) mips64el - MIPS (64-bit little endian) mipsel - MIPS (32-bit little endian) msp430 - MSP430 [experimental] nvptx - NVIDIA PTX 32-bit nvptx64 - NVIDIA PTX 64-bit ppc32 - PowerPC 32 ppc64 - PowerPC 64 ppc64le - PowerPC 64 LE riscv32 - 32-bit RISC-V riscv64 - 64-bit RISC-V thumb - Thumb thumbeb - Thumb (big endian) wasm32 - WebAssembly 32-bit wasm64 - WebAssembly 64-bit x86 - 32-bit X86: Pentium-Pro and above x86-64 - 64-bit X86: EM64T and AMD64 Note that both ldc2 and dmd has the same complain |
March 15, 2020 Re: Why can't the compiler properly detect the type of Array!string("something")? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adnan | On Sunday, 15 March 2020 at 00:04:09 UTC, Adnan wrote: > On Saturday, 14 March 2020 at 23:54:44 UTC, Adam D. Ruppe wrote: >> On Saturday, 14 March 2020 at 23:39:11 UTC, Adnan wrote: >>> Full code >> >> this worked for me when i copy/pasted it... are you sure that has the error? if so what compiler version you on? > > This is indeed very strange, godbolt says it's alright: https://d.godbolt.org/z/DaaPxX > > Now my compiler version: > $ dmd --version && ldc2 --version > DMD64 D Compiler v2.090.0 > Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved written by Walter Bright > LDC - the LLVM D compiler (1.18.0): > based on DMD v2.088.1 and LLVM 9.0.0 > built with LDC - the LLVM D compiler (1.18.0) > Default target: x86_64-unknown-linux-gnu > Host CPU: znver1 > http://dlang.org - http://wiki.dlang.org/LDC > > Registered Targets: > aarch64 - AArch64 (little endian) > aarch64_32 - AArch64 (little endian ILP32) > aarch64_be - AArch64 (big endian) > arm - ARM > arm64 - ARM64 (little endian) > arm64_32 - ARM64 (little endian ILP32) > armeb - ARM (big endian) > mips - MIPS (32-bit big endian) > mips64 - MIPS (64-bit big endian) > mips64el - MIPS (64-bit little endian) > mipsel - MIPS (32-bit little endian) > msp430 - MSP430 [experimental] > nvptx - NVIDIA PTX 32-bit > nvptx64 - NVIDIA PTX 64-bit > ppc32 - PowerPC 32 > ppc64 - PowerPC 64 > ppc64le - PowerPC 64 LE > riscv32 - 32-bit RISC-V > riscv64 - 64-bit RISC-V > thumb - Thumb > thumbeb - Thumb (big endian) > wasm32 - WebAssembly 32-bit > wasm64 - WebAssembly 64-bit > x86 - 32-bit X86: Pentium-Pro and above > x86-64 - 64-bit X86: EM64T and AMD64 > > > Note that both ldc2 and dmd has the same complain d$ dmd --version && cat source/app.d && dub build DMD64 D Compiler v2.090.0 Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved written by Walter Bright string smallestRepr(const string arg) { auto repeated = arg ~ arg; string result = arg; foreach (i; 1 .. arg.length) { const slice = repeated[i .. i + arg.length]; if (slice < result) result = slice; } return result; } unittest { assert("cba".smallestRepr() == "acb"); } void main(const string[] args) { import std.stdio : write, File; import std.container : Array; Array!string[string] wordTable; foreach (string word; File(args[1]).byLineCopy()) { word = word[0 .. $ - 1]; // strip the newline character const string key = word.smallestRepr(); debug { if (key in wordTable) wordTable[key] ~= word; else wordTable[key] = Array!string(word); } else { wordTable.require(key, Array!string()) ~= word; } } foreach (array; wordTable.values) { if (array.length == 4) { foreach (word; array) { write(word, ", "); } write("\n"); break; } } } Performing "debug" build using dmd for x86_64. dbed ~master: building configuration "application"... source/app.d(29,34): Error: template std.container.array.Array!string.Array.__ctor cannot deduce function from argument types !()(string), candidates are: /snap/dmd/99/bin/../import/phobos/std/container/array.d(467,5): __ctor(U)(U[] values...) with U = immutable(char) must satisfy the following constraint: isImplicitlyConvertible!(U, T) /snap/dmd/99/bin/../import/phobos/std/container/array.d(501,5): __ctor(Range)(Range r) with Range = string must satisfy the following constraint: isImplicitlyConvertible!(ElementType!Range, T) source/app.d(36,2): Warning: statement is not reachable dmd failed with exit code 1. |
Copyright © 1999-2021 by the D Language Foundation