Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Disallow conflicting parameter strage classes
- Loading branch information
Showing
3 changed files
with
78 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
TEST_OUTPUT: | ||
--- | ||
fail_compilation/fail12744.d(38): Error: incompatible parameter storage classes 'ref' and 'out' | ||
fail_compilation/fail12744.d(52): Error: template instance fail12744.bar12744R!(foo12744O) error instantiating | ||
fail_compilation/fail12744.d(38): Error: incompatible parameter storage classes 'ref' and 'lazy' | ||
fail_compilation/fail12744.d(53): Error: template instance fail12744.bar12744R!(foo12744L) error instantiating | ||
fail_compilation/fail12744.d(39): Error: incompatible parameter storage classes 'out' and 'ref' | ||
fail_compilation/fail12744.d(56): Error: template instance fail12744.bar12744O!(foo12744R) error instantiating | ||
fail_compilation/fail12744.d(39): Error: incompatible parameter storage classes 'out' and 'lazy' | ||
fail_compilation/fail12744.d(58): Error: template instance fail12744.bar12744O!(foo12744L) error instantiating | ||
fail_compilation/fail12744.d(40): Error: incompatible parameter storage classes 'lazy' and 'ref' | ||
fail_compilation/fail12744.d(61): Error: template instance fail12744.bar12744L!(foo12744R) error instantiating | ||
fail_compilation/fail12744.d(40): Error: incompatible parameter storage classes 'lazy' and 'out' | ||
fail_compilation/fail12744.d(62): Error: template instance fail12744.bar12744L!(foo12744O) error instantiating | ||
fail_compilation/fail12744.d(41): Error: incompatible parameter storage classes 'auto ref' and 'out' | ||
fail_compilation/fail12744.d(67): Error: template fail12744.bar12744A cannot deduce function from argument types !(foo12744O)(int), candidates are: | ||
fail_compilation/fail12744.d(41): fail12744.bar12744A(alias f)(auto ref PTT12744!f args) | ||
fail_compilation/fail12744.d(41): Error: incompatible parameter storage classes 'auto ref' and 'lazy' | ||
fail_compilation/fail12744.d(68): Error: template fail12744.bar12744A cannot deduce function from argument types !(foo12744L)(int), candidates are: | ||
fail_compilation/fail12744.d(41): fail12744.bar12744A(alias f)(auto ref PTT12744!f args) | ||
--- | ||
*/ | ||
template PTT12744(func...) | ||
{ | ||
static if (is(typeof(func[0]) P == function)) | ||
alias PTT12744 = P; | ||
else | ||
static assert(0); | ||
} | ||
|
||
void foo12744N( int x) {} | ||
void foo12744R( ref int x) {} | ||
void foo12744O( out int x) {} | ||
void foo12744L(lazy int x) {} | ||
|
||
void bar12744N(alias f)( PTT12744!f args) {} | ||
void bar12744R(alias f)( ref PTT12744!f args) {} | ||
void bar12744O(alias f)( out PTT12744!f args) {} | ||
void bar12744L(alias f)( lazy PTT12744!f args) {} | ||
void bar12744A(alias f)(auto ref PTT12744!f args) {} | ||
|
||
void main() | ||
{ | ||
alias bNN = bar12744N!foo12744N; | ||
alias bNR = bar12744N!foo12744R; | ||
alias bNO = bar12744N!foo12744O; | ||
alias bNL = bar12744N!foo12744L; | ||
|
||
alias bRN = bar12744R!foo12744N; | ||
alias bRR = bar12744R!foo12744R; | ||
alias bRO = bar12744R!foo12744O; // error | ||
alias bRL = bar12744R!foo12744L; // error | ||
|
||
alias bON = bar12744O!foo12744N; | ||
alias bOR = bar12744O!foo12744R; // error | ||
alias bOO = bar12744O!foo12744O; | ||
alias bOL = bar12744O!foo12744L; // error | ||
|
||
alias bLN = bar12744L!foo12744N; | ||
alias bLR = bar12744L!foo12744R; // error | ||
alias bLO = bar12744L!foo12744O; // error | ||
alias bLL = bar12744L!foo12744L; | ||
|
||
bar12744A!foo12744N(1); | ||
bar12744A!foo12744R(1); | ||
bar12744A!foo12744O(1); // error | ||
bar12744A!foo12744L(1); // error | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters