D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 10956 - std.getopt error on wrongly position arguments should improve
Summary: std.getopt error on wrongly position arguments should improve
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: All All
: P2 normal
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-09-03 09:30 UTC by Andrej Mitrovic
Modified: 2020-03-21 03:56 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Andrej Mitrovic 2013-09-03 09:30:22 UTC
-----
import std.getopt;

void main(string[] args)
{
    int i;
    getopt(args, &i, "");
}
-----

This call is wrong, the text argument should come before the pointer, but the diagnostics are bad:

std\getopt.d(499): Deprecation: using * on an array is deprecated; use *(receiver).ptr instead
std\getopt.d(499): Error: cannot modify immutable expression *cast(immutable(char)*)receiver
std\getopt.d(500): Deprecation: using * on an array is deprecated; use *(receiver).ptr instead
std\getopt.d(500): Deprecation: using * on an array is deprecated; use *(receiver).ptr instead
std\getopt.d(500): Error: cannot modify immutable expression *cast(immutable(char)*)receiver
std\getopt.d(400): Error: template instance std.getopt.handleOption!string error instantiating
std\getopt.d(351):        instantiated from here: getoptImpl!(int*, string)
test.d(8):        instantiated from here: getopt!(int*, string)
std\getopt.d(351): Error: template instance std.getopt.getoptImpl!(int*, string) error instantiating
test.d(8):        instantiated from here: getopt!(int*, string)
test.d(8): Error: template instance std.getopt.getopt!(int*, string) error instantiating
Comment 1 basile-z 2015-11-27 17:11:14 UTC
diagnostic has changed but still bad. 

The variadic args in getoptImpl(T...) could be statically checked, even index: must be string, odd index: must be pointer.
Comment 2 basile-z 2015-12-01 13:25:24 UTC
(In reply to Andrej Mitrovic from comment #0)
> -----
> import std.getopt;
> 
> void main(string[] args)
> {
>     int i;
>     getopt(args, &i, "");
> }
> -----
> 
> This call is wrong, the text argument should come before the pointer, but
> the diagnostics are bad:
> 
> std\getopt.d(499): Deprecation: using * on an array is deprecated; use
> *(receiver).ptr instead
> std\getopt.d(499): Error: cannot modify immutable expression
> *cast(immutable(char)*)receiver
> std\getopt.d(500): Deprecation: using * on an array is deprecated; use
> *(receiver).ptr instead
> std\getopt.d(500): Deprecation: using * on an array is deprecated; use
> *(receiver).ptr instead
> std\getopt.d(500): Error: cannot modify immutable expression
> *cast(immutable(char)*)receiver
> std\getopt.d(400): Error: template instance std.getopt.handleOption!string
> error instantiating
> std\getopt.d(351):        instantiated from here: getoptImpl!(int*, string)
> test.d(8):        instantiated from here: getopt!(int*, string)
> std\getopt.d(351): Error: template instance std.getopt.getoptImpl!(int*,
> string) error instantiating
> test.d(8):        instantiated from here: getopt!(int*, string)
> test.d(8): Error: template instance std.getopt.getopt!(int*, string) error
> instantiating

I'll probably propose something in the next weeks. I've currently designed a template that works in the constraint, however it misses a special case (option passed for next param):

http://dpaste.dzfl.pl/b8d1fb991482

Anyway, quite faisable...
Comment 3 basile-z 2015-12-06 01:58:27 UTC
(In reply to bb.temp from comment #2)
> (In reply to Andrej Mitrovic from comment #0)
> > -----
> Anyway, quite faisable...

done:

https://github.com/BBasile/phobos/blob/ce4c33ed68ae7a1131a5b45c1ddae47c1f391d5c/std/getopt.d#L537-L610

http://dpaste.dzfl.pl/85c70ecd3ddd

all the existing unittests pass.
Comment 4 basile-z 2016-02-18 08:08:15 UTC
closed by

https://github.com/D-Programming-Language/phobos/pull/3859