Re: [PATCH] builtin/config: work around an unsized array forward declaration
- From
Beat Bolli <dev+git@drbeat.li>
- Date
- Jul 5, 2018, 19:50 UTC
- Message-ID
- <phlsmp$mot$1@blaine.gmane.org>
- In-Reply-To
- <20180705193807.GA4826@sigill.intra.peff.net>
Hi Peff
On 05.07.18 21:38, Jeff King wrote:
Show 25 quoted lines
> On Thu, Jul 05, 2018 at 08:34:45PM +0200, Beat Bolli wrote: > >> As reported here[0], Microsoft Visual Studio 2017.2 and "gcc -pedantic" >> don't understand the forward declaration of an unsized static array. >> They insist on an array size: >> >> d:\git\src\builtin\config.c(70,46): error C2133: 'builtin_config_options': unknown size >> >> The thread [1] explains that this is due to the single-pass nature of >> old compilers. > > Right, that makes sense. > >> To work around this error, introduce the forward-declared function >> usage_builtin_config() instead that uses the array >> builtin_config_options only after it has been defined. >> >> Also use this function in all other places where usage_with_options() is >> called with the same arguments. > > Your patch is obviously correct, but I think here there might be an even > simpler solution: just bump option_parse_type() below the declaration, > since it's the only one that needs it. That hunk is bigger, but the > overall diff is simpler, and we don't need to carry that extra wrapper > function.
That was dscho's first try in the GitHub issue. It doesn't compile because the OPT_CALLBACK* macros in the builtin_config_options declaration inserts a pointer to option_parse_type into the array items. We need at least one forward declaration, and my patch seemed the least intrusive.
Show 20 quoted lines
> As a general rule for this case (because reordering isn't always an
> option), I also wonder if we should prefer just introducing a pointer
> alias:
>
> /* forward declaration is a pointer */
> static struct option *builtin_config_options;
>
> /* later, declare the actual storage and its alias */
> static struct option builtin_config_options_storage[] = {
> ...
> };
> static struct option *builtin_config_options = builtin_config_options_storage;
>
> There are occasionally cases where the caller really wants an array and
> not a pointer, but in practice those are pretty rare.
>
> I have a slight preference for the reordering solution in this case, but
> any of them would be OK with me.
>
> -Peff Regards, Beat