Why is this pure function taking a string literal not CTFE-executable?

Simon simon.vanbernem at yahoo.de
Sat Jun 1 17:51:42 UTC 2019


Hi Guys!

In my programm, I have a custom String-type that I want to 
initialize some variables of at compile time by casting a string 
literal to said custom String type. I thought I could achieve 
this straight forwardly, but after trying a bit, I could not find 
a (simple) working solution. I made this minimal example to show 
where the easy solution all fall flat:

struct My_String{
	long size;
	char* data;
}

My_String make_my_string(string s){
	My_String my_string;
	my_string.data = cast(char*) s.ptr;
	my_string.size = s.length;
	return my_string;
}

struct Dummy{
	My_String s = make_my_string("hello!");
}

void main(){
	Dummy dummy;
}

Which produces the compilation error "cannot use non-constant 
CTFE pointer in an initializer My_String(6L, &"hello!"[0])". I do 
not understand this error message. What is the non-constant CTFE 
pointer here. The "data"-member? If so, why does this compile:

struct My_String{
	long size;
	char* data;
}

struct Dummy{
	My_String s = My_String("hello!".length, cast(char*) 
"hello!".ptr);
}

void main(){
	Dummy dummy;
}

Why does the error message show an opcall to My_String with 
filled out members ("6L, &"hello!"[0]"), although the code only 
ever default-constructs a My_string variable? I am confused. And 
why on earth does this work:

struct My_String{
	long size;
	char* data;
}

My_String make_my_string(string s){
	My_String my_string;
	my_string.data = cast(char*) s.ptr;
	my_string.size = s.length;
	return my_string;
}

void main(){
	My_String s = make_my_string("hello!");
}

Please help, I have no idea whats going on here.




More information about the Digitalmars-d-learn mailing list