Thoughts about D

Steven Schveighoffer schveiguy at yahoo.com
Thu Nov 30 14:35:23 UTC 2017


On 11/29/17 11:50 PM, Nicholas Wilson wrote:
> On Thursday, 30 November 2017 at 04:21:20 UTC, Steven Schveighoffer wrote:
>> On 11/29/17 10:29 PM, Walter Bright wrote:
>>> Another issue (I should check this again) was doing null checks on 
>>> member function calls, which is not necessary since if they're null 
>>> it'll seg fault.
>>
>> Just happened last release.
>>
>> https://dlang.org/changelog/2.077.0.html#removePreludeAssert
> 
> That was specifically for constructors and destructors (i.e. 
> (cast(Foo)null).__ctor() was the only way to trigger that assert) not 
> member functions (of classes), which I believe is still part of the 
> compiler.

Then either the changelog entry is wrong, or the fix was more 
encompassing than the author/reviewers thought:

Stevens-MacBook-Pro:testd steves$ cat testprelude.d
struct S
{
     int foo() { return 1; }
}

void main()
{
     S s;
     auto x = s.foo;
}
Stevens-MacBook-Pro:testd steves$ dvm use 2.076.1
Stevens-MacBook-Pro:testd steves$ dmd -vcg-ast testprelude.d
Stevens-MacBook-Pro:testd steves$ cat testprelude.d.cg
import object;
struct S
{
	int foo()
	{
		assert(&this, "null this");
		return 1;
	}
}
void main()
{
	S s = 0;
	int x = s.foo();
	return 0;
}
RTInfo!(S)
{
	enum typeof(null) RTInfo = null;

}
Stevens-MacBook-Pro:testd steves$ dvm use 2.077.0
Stevens-MacBook-Pro:testd steves$ dmd -vcg-ast testprelude.d
Stevens-MacBook-Pro:testd steves$ cat testprelude.d.cg
import object;
struct S
{
	int foo()
	{
		return 1;
	}
}
void main()
{
	S s = 0;
	int x = s.foo();
	return 0;
}
RTInfo!(S)
{
	enum typeof(null) RTInfo = null;

}

-Steve


More information about the Digitalmars-d mailing list