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