Bug 18238 – Templates only used during CTFE shouldn't be code-gened

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
x86_64
OS
All
Creation time
2018-01-14T22:11:53Z
Last change time
2024-12-13T18:56:09Z
Assigned to
No Owner
Creator
Seb
Moved to GitHub: dmd#19364 →

Comments

Comment #0 by greensunny12 — 2018-01-14T22:11:53Z
The string of `foo` shouldn't make it to the object file: ``` auto foo()() { // shouldn't appear in the object file return "My super long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long string"; } void main(string[] args) { import core.stdc.stdio; static immutable s = foo()[0..2]; printf("%.*s", 2, s.ptr); } ``` ``` .text._D3foo__TQhZQkFNaNbNiNfZAya segment assume CS:.text._D3foo__TQhZQkFNaNbNiNfZAya _D3foo__TQhZQkFNaNbNiNfZAya: push RBP mov RBP,RSP lea RDX,_TMP0@PC32[RIP] mov EAX,05F7h pop RBP ret add [RAX],AL .text._D3foo__TQhZQkFNaNbNiNfZAya ends minfo segment dd offset FLAT:_D3foo12__ModuleInfoZ@64 db 000h,000h,000h,000h ;.... minfo ends ``` ``` > cat foo.o | grep -a "long" : ;I@Digital Mars D v2.078.0foo.d/home/seb/dlang/dmd/srcfoounsigned longchaq_Array_charlength`#ptry_D3foo4mainFAAyaZ1syAa~ ~_Array_ucentlength`#ptrÏ# 9D main_DmaiargsÔ` foo.foo!().foo_D3foo__TQhZQkFNaNbNiNfZAya~9ÿ_Dmain9_D3foo__TQhZQkFNaNbNiNfZAya5MyMy super long long long long long long long long long long long long long long long long long ^[[?1;2c long long long long long long long long long long long long long long long ```
Comment #1 by johnnymarler — 2018-01-19T23:00:41Z
I'm not sure this is a good example. I don't think the compiler can actually determine that it doesn't need to bring the entire string into object code. For example, if you had done: printf("%s", s.ptr); then the expected behavior would be to print the entire string (at least from offset 2). But the only thing that was changed was the format specifier in the printf statement, which means that the D compiler would have had to understand the format specifier to know whether or not it needed to bring the entire string to object code. But you can imagine other examples, such as an extern(C) function that takes a null-terminated string of which the compiler cannot determine anything about. If you passed the return value of foo to that function then you have to bring the whole string into object code. I don't think that slicing a string literal is enough for the compiler to only bring that slice to object code. This would result in astonishing behavior. ``` immutable someString = "hello"[0 .. 1]; void foo() { printf("%s\n", someString.ptr); } ``` I would expect this to print "hello", but if the compiler only brought "h" to object code than I would be very confused.
Comment #2 by robert.schadek — 2024-12-13T18:56:09Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19364 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB