Allow shortened method syntax for constructors

This commit is contained in:
Dennis Korpel 2024-11-21 21:20:09 +01:00 committed by The Dlang Bot
parent f28b1a0f0a
commit 56eb579a45
3 changed files with 32 additions and 1 deletions

View file

@ -0,0 +1,15 @@
Shortened method syntax can now be used in constructors
This used to raise an error "cannot return expression from constructor", but it's now supported:
---
struct Number
{
int x;
this(int x) => this.x = x;
this(float x) => this(cast(int) x);
}
---
Postblits and destructors already supported shortened method syntax because they return `void`.

View file

@ -5252,7 +5252,10 @@ class Parser(AST, Lexer = dmd.lexer.Lexer) : Lexer
error("missing `do { ... }` after `in` or `out`");
const returnloc = token.loc;
nextToken();
f.fbody = new AST.ReturnStatement(returnloc, parseExpression());
if (f.isCtorDeclaration)
f.fbody = new AST.ExpStatement(returnloc, parseExpression());
else
f.fbody = new AST.ReturnStatement(returnloc, parseExpression());
f.endloc = token.loc;
check(TOK.semicolon);
break;

View file

@ -13,6 +13,10 @@ class A {
// or normal method defintions
bool isNull() => this is null;
this() {}
this(int x) => _x = x;
this(float y) => this(cast(int) y);
}
class B : A{
@ -36,3 +40,12 @@ void func() {
// Issue 24088 - https://issues.dlang.org/show_bug.cgi?id=24088
S!int f() => S!int();
}
struct T
{
void inc() {}
this(this) => inc();
void free() {}
~this() => free();
}