diff --git a/libc/src/unistd/getopt.h b/libc/src/unistd/getopt.h --- a/libc/src/unistd/getopt.h +++ b/libc/src/unistd/getopt.h @@ -15,7 +15,7 @@ namespace __llvm_libc { namespace impl { -void set_getopt_state(char **, int *, int *, unsigned *, int, FILE *); +void set_getopt_state(char **, int *, int *, unsigned *, int *, FILE *); } int getopt(int argc, char *const argv[], const char *optstring); diff --git a/libc/src/unistd/getopt.cpp b/libc/src/unistd/getopt.cpp --- a/libc/src/unistd/getopt.cpp +++ b/libc/src/unistd/getopt.cpp @@ -22,7 +22,6 @@ namespace __llvm_libc { template struct RefWrapper { - RefWrapper(T *ptr) : ptr(ptr) {} RefWrapper &operator=(const RefWrapper &) = default; operator T &() { return *ptr; } T &get() { return *ptr; } @@ -35,7 +34,7 @@ RefWrapper optopt; RefWrapper optpos; - int opterr; + RefWrapper opterr; FILE *errstream; @@ -43,7 +42,9 @@ template void report_error(const char *fmt, Ts... ts) { if (opterr) - __llvm_libc::fprintf(errstream, fmt, ts...); + __llvm_libc::fprintf( + errstream ? errstream : reinterpret_cast(__llvm_libc::stderr), + fmt, ts...); } }; @@ -171,25 +172,21 @@ namespace impl { extern "C" { - char *optarg = nullptr; int optind = 1; int optopt = 0; int opterr = 0; - } static unsigned optpos; -static GetoptContext ctx{ - &impl::optarg, &impl::optind, - &impl::optopt, &optpos, - impl::opterr, reinterpret_cast(__llvm_libc::stderr)}; +static GetoptContext ctx{&impl::optarg, &impl::optind, &impl::optopt, + &optpos, &impl::opterr, /*errstream=*/nullptr}; #ifndef LIBC_COPT_PUBLIC_PACKAGING // This is used exclusively in tests. void set_getopt_state(char **optarg, int *optind, int *optopt, unsigned *optpos, - int opterr, FILE *errstream) { + int *opterr, FILE *errstream) { ctx = {optarg, optind, optopt, optpos, opterr, errstream}; } #endif diff --git a/libc/test/src/unistd/getopt_test.cpp b/libc/test/src/unistd/getopt_test.cpp --- a/libc/test/src/unistd/getopt_test.cpp +++ b/libc/test/src/unistd/getopt_test.cpp @@ -31,7 +31,7 @@ void set_state(FILE *errstream) { __llvm_libc::impl::set_getopt_state( &test_globals::optarg, &test_globals::optind, &test_globals::optopt, - &test_globals::optpos, test_globals::opterr, errstream); + &test_globals::optpos, &test_globals::opterr, errstream); } // TODO: could be either llvm-libc's or the system libc's. The former