Re: [PATCH] Fix Solaris Workshop Compiler issues
- From
Björn Steinbrink <b.steinbrink@gmx.de>
- Date
- Nov 15, 2007, 00:44 UTC
- Message-ID
- <20071115004404.GB25021@atjola.homenet>
- In-Reply-To
- <7v3av89wq7.fsf@gitster.siamese.dyndns.org>
On 2007.11.14 16:30:08 -0800, Junio C Hamano wrote:
Show 46 quoted lines
> Björn Steinbrink <B.Steinbrink@gmx.de> writes:
>
> > No, just tried with cc: Sun C 5.7 Patch 117837-06 2005/10/05
> >
> > It's the "struct hack", ie. the incomplete array at the end of
> > delta_index. Still looking for a fix/workaround.
>
> Do you mean the "FLEX_ARRAY" thing?
>
> You can ask for FLEX_ARRAY from the command line of your "make"
> process.
>
> There is this thing in git-compat-util.h
>
> #ifndef FLEX_ARRAY
> #if defined(__GNUC__) && (__GNUC__ < 3)
> #define FLEX_ARRAY 0
> #else
> #define FLEX_ARRAY /* empty */
> #endif
> #endif
>
> The sources are written this way:
>
> struct foo {
> ... other members ...
> char last_member_that_is_flexible[FLEX_ARRAY];
> };
>
> For older gcc, because we know about its lack of support, the
> above turns into:
>
> struct foo {
> ... other members ...
> char last_member_that_is_flexible[0];
> }
>
> But for recent enough compilers that grok the "flexible array
> members", the above expands to:
>
> struct foo {
> ... other members ...
> char last_member_that_is_flexible[];
> }
>
> Maybe your compiler needs -DFLEX_ARRAY=0 in CFLAGS?Actually, I just created a test-case remotely on a Solaris box in my university (see below) and didn't compile the actual git code. With the FAM, cc complains about a redeclared identifier, with a zero-sized array, it complains that an array cannot be zero-sized...
Seems to be a known bug in Sun Studio 10: http://forum.java.sun.com/thread.jspa?threadID=5071896&messageID=9263771
Björn
#include <stdio.h>
struct foo; void bar(const struct foo *, unsigned long);
struct bla {
unsigned long foo;
};struct foo {
unsigned long val;
struct bla *blas[];
};void bar(const struct foo *foo, unsigned long val)
{
printf("%lu %lu\n", foo->val, val);
}int main()
{
struct foo foo;
foo.val = 10;
bar(&foo, 20);return 0; }