Skip to content

Commit

Permalink
Fix bugzilla 24883 - Speculative template overload error escapes with…
Browse files Browse the repository at this point in the history
… `-preview=rvaluerefparam`
  • Loading branch information
Dennis Korpel committed Nov 26, 2024
1 parent 519d388 commit 7d282bd
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
8 changes: 7 additions & 1 deletion compiler/src/dmd/templatesem.d
Original file line number Diff line number Diff line change
Expand Up @@ -1252,7 +1252,13 @@ extern (D) MATCHpair deduceFunctionTemplateMatch(TemplateDeclaration td, Templat
//printf("farg = %s %s\n", farg.type.toChars(), farg.toChars());

RootObject oarg = farg;
if ((fparam.storageClass & STC.ref_) && (!(fparam.storageClass & STC.auto_) || farg.isLvalue()))

if (farg.isFuncExp())
{
// When assigning an untyped (void) lambda `x => y` to a `(F)(ref F)` parameter,
// we don't want to deduce type void creating a void parameter
}
else if ((fparam.storageClass & STC.ref_) && (!(fparam.storageClass & STC.auto_) || farg.isLvalue()))
{
/* Allow expressions that have CT-known boundaries and type [] to match with [dim]
*/
Expand Down
6 changes: 6 additions & 0 deletions compiler/test/compilable/rvalueref.d
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,9 @@ struct AS

void popFront(ref string) { }
static assert(!is(typeof((R r) => r.popFront)));

// https://issues.dlang.org/show_bug.cgi?id=24883
int toString(Writer)(ref Writer sink) => 3;
int toString(void delegate(scope const(char)[]) sink) => 4;
void put() {}
pragma(msg, toString(dst => put()));

0 comments on commit 7d282bd

Please sign in to comment.