[Issue 24682] New: [next edition] Require named arguments in certain circumstances

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Jul 25 09:59:43 UTC 2024


https://issues.dlang.org/show_bug.cgi?id=24682

          Issue ID: 24682
           Summary: [next edition] Require named arguments in certain
                    circumstances
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: qs.il.paperinik at gmail.com

In certain circumstances, e.g. passing a `true` or `false` as function
parameters, named arguments should be required (unless the bound function
parameter is unnamed, of course, which is common for function pointers and
delegates).

Examples of “problematic” arguments are basic literals (bool literals, `null`,
numbers, and strings, but not e.g. (associative) array literals or lambda
expressions), as quite often, it’s unclear at the function invocation what
those mean. In contrast, calling a function with a named variable or expression
usually gives a hint about what the argument means. (Associative) array
literals and lambda expressions likewise often enough carry enough information
what the parameter is for so that such an error would be a false positive.

Also, some other basic expressions should count as literals, in particular,
literals under a cast (think `cast(byte)0`) or function-call-like type
conversion (e.g. `byte(0)`), as those are essentially literals.

The error message should print a copy of the function call expression with
named arguments added, or indicate exactly where the parameter name were to be
added in some other way. Examples:
```
Error: Basic literals require a named argument when passed to a function.
       f(someArg, mustUse: true);
```
or
Error: Basic literals require a named argument when passed to a function.
       f(someArg, true);
                  ~~~~ mustUse: true
```
or
Error: Basic literals require a named argument when passed to a function.
       f(someArg, true);
                  ^ mustUse:
```

This enhancement is in line with D’s policy to make code invalid that would
have a formally clear interpretation, but may be confusing to read, when a
trivial mitigation is possible and reasonable. Other examples are banning `=>
{}` and requiring parentheses to clarify operator precedence of bit-wise and
comparison operators.

--


More information about the Digitalmars-d-bugs mailing list