Some code that compiles but shouldn't

H. S. Teoh hsteoh at quickfur.ath.cx
Mon Dec 30 18:35:26 UTC 2019


On Mon, Dec 30, 2019 at 06:18:49PM +0000, uranuz via Digitalmars-d-learn wrote:
[...]
> 	void getCompiledTemplate(HTTPContext ctx)
> 	{
> 		import std.exception: enforce;
> 		enforce(ctx, `ctx is null`);
> 		enforce(ctx.request, `ctx.request is null`);
> 		enforce(ctx.request.form, `ctx.request is null`);
> 		enforce(ivyEngine !is null, `ivyEngine is null`);
> 		string moduleName = ctx.request.form[`moduleName`];
> 		auto mod = ivyEngine.getByModuleName(moduleName);
> 		return ctx.response.write(mod.toStdJSON().toString());
> 	}
> 
> 
> So as you see I have added a lot of enforce to test if all variables
> are not null. But nothing was null and the reason of segfault were
> unclear.  Today I just went home. Opened a bottle of beer. And have
> noticed that function is marked as returning `void`, but in fact it
> doesn't. When I fixed this segfault have gone. But why this even
> compiled?! Interesting...

That's weird indeed. Do you have a minimal case that reproduces this
problem? I tried to return the result of a non-void function call from a
void function, and it wouldn't compile, as expected.  It would be
interesting to see when exactly this compiler check is wrongly skipped.


T

-- 
Ignorance is bliss... until you suffer the consequences!


More information about the Digitalmars-d-learn mailing list