Bug 351 – Recursive string template doesn't work if the terminating specialisation is given first

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Windows
Creation time
2006-09-16T18:13:00Z
Last change time
2014-02-15T13:21:57Z
Keywords
rejects-valid
Assigned to
bugzilla
Creator
smjg
Blocks
340

Comments

Comment #0 by smjg — 2006-09-16T18:13:03Z
---------- import std.stdio; template Reverse(char[] s: "") { const char[] Reverse = ""; } template Reverse(char[] s) { const char[] Reverse = Reverse!(s[1..$]) ~ s[0]; } void main() { writefln(Reverse!("Recursive string template")); } ---------- D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string slice [1 .. 0] is out of bounds D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string slice [1 .. 0] is out of bounds D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): void has no value D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): incompatible types for ((Reverse!(""[1..0])) ~ (cast(int)(""[0]))): 'void' and 'int' D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): Can only concatenate arrays, not (void ~ int) D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): cannot implicitly convert expression (Reverse!(""[1..0]) ~ cast(int)(""[0])) of type int to char[] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): template instance string_template1.Reverse!("") error instantiating D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): template instance string_template1.Reverse!("e") error instantiating D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 is out of bounds [0 .. 0] D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): template instance string_template1.Reverse!("te") error instantiating [and so on....] ---------- If the two definitions of template Reverse are swapped, then the code compiles and runs correctly.
Comment #1 by thomas-dloop — 2006-09-20T14:20:52Z
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [email protected] schrieb am 2006-09-16: > http://d.puremagic.com/issues/show_bug.cgi?id=351 > ---------- > import std.stdio; > > template Reverse(char[] s: "") { > const char[] Reverse = ""; > } > > template Reverse(char[] s) { > const char[] Reverse = Reverse!(s[1..$]) ~ s[0]; > } > > void main() { > writefln(Reverse!("Recursive string template")); > } > ---------- > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string slice [1 > .. 0] is out of bounds > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string slice [1 > .. 0] is out of bounds > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): void has no > value > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): incompatible > types for ((Reverse!(""[1..0])) ~ (cast(int)(""[0]))): 'void' and 'int' > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): Can only > concatenate arrays, not (void ~ int) > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): cannot > implicitly convert expression (Reverse!(""[1..0]) ~ cast(int)(""[0])) of type > int to char[] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): template > instance string_template1.Reverse!("") error instantiating > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): template > instance string_template1.Reverse!("e") error instantiating > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): string index 0 > is out of bounds [0 .. 0] > D:\My Documents\Programming\D\Tests\bugs\string_template1.d(8): template > instance string_template1.Reverse!("te") error instantiating > [and so on....] > ---------- > > If the two definitions of template Reverse are swapped, then the code compiles > and runs correctly. Added to DStress as http://dstress.kuehne.cn/compile/t/template_44_A.d http://dstress.kuehne.cn/compile/t/template_44_B.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFFEZkzLK5blCcjpWoRApT/AJ4uytg24UNRfmR6fO+mrVEx9eeF/ACfZ6+L 65qbqePX/9303yq/FqDmMMI= =wuy3 -----END PGP SIGNATURE-----
Comment #2 by bugzilla — 2006-10-10T03:27:23Z
Fixed DMD 0.169