[PATCH] Compilation: zero-length array declaration.
authorJunio C Hamano <junkio@cox.net>
Sat, 7 Jan 2006 09:33:54 +0000 (01:33 -0800)
committerJunio C Hamano <junkio@cox.net>
Sat, 7 Jan 2006 18:51:06 +0000 (10:51 -0800)
ISO C99 (and GCC 3.x or later) lets you write a flexible array
at the end of a structure, like this:

struct frotz {
int xyzzy;
char nitfol[]; /* more */
};

GCC 2.95 and 2.96 let you to do this with "char nitfol[0]";
unfortunately this is not allowed by ISO C90.

This declares such construct like this:

struct frotz {
int xyzzy;
char nitfol[FLEX_ARRAY]; /* more */
};

and git-compat-util.h defines FLEX_ARRAY to 0 for gcc 2.95 and
empty for others.

If you are using a C90 C compiler, you should be able
to override this with CFLAGS=-DFLEX_ARRAY=1 from the
command line of "make".

Signed-off-by: Junio C Hamano <junkio@cox.net>
blob.c
cache.h
commit.c
git-compat-util.h
ls-files.c
object.c
object.h
receive-pack.c
tag.c
tree.c

diff --git a/blob.c b/blob.c
index ea52ad5..84ec121 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -1,5 +1,5 @@
-#include "blob.h"
 #include "cache.h"
+#include "blob.h"
 #include <stdlib.h>
 
 const char *blob_type = "blob";
diff --git a/cache.h b/cache.h
index cb87bec..5fd2687 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -81,7 +81,7 @@ struct cache_entry {
        unsigned int ce_size;
        unsigned char sha1[20];
        unsigned short ce_flags;
-       char name[0];
+       char name[FLEX_ARRAY]; /* more */
 };
 
 #define CE_NAMEMASK  (0x0fff)
@@ -257,7 +257,7 @@ extern int checkout_entry(struct cache_entry *ce, struct checkout *state);
 extern struct alternate_object_database {
        struct alternate_object_database *next;
        char *name;
-       char base[0]; /* more */
+       char base[FLEX_ARRAY]; /* more */
 } *alt_odb_list;
 extern void prepare_alt_odb(void);
 
@@ -271,7 +271,8 @@ extern struct packed_git {
        unsigned int pack_use_cnt;
        int pack_local;
        unsigned char sha1[20];
-       char pack_name[0]; /* something like ".git/objects/pack/xxxxx.pack" */
+       /* something like ".git/objects/pack/xxxxx.pack" */
+       char pack_name[FLEX_ARRAY]; /* more */
 } *packed_git;
 
 struct pack_entry {
@@ -286,7 +287,7 @@ struct ref {
        unsigned char new_sha1[20];
        unsigned char force;
        struct ref *peer_ref; /* when renaming */
-       char name[0];
+       char name[FLEX_ARRAY]; /* more */
 };
 
 extern int git_connect(int fd[2], char *url, const char *prog);
index edd4ded..fb02ba6 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -1,6 +1,6 @@
+#include "cache.h"
 #include "tag.h"
 #include "commit.h"
-#include "cache.h"
 
 int save_commit_buffer = 1;
 
index c353b27..12ce659 100644 (file)
@@ -1,6 +1,14 @@
 #ifndef GIT_COMPAT_UTIL_H
 #define GIT_COMPAT_UTIL_H
 
+#ifndef FLEX_ARRAY
+#if defined(__GNUC__) && (__GNUC__ < 3)
+#define FLEX_ARRAY 0
+#else
+#define FLEX_ARRAY /* empty */
+#endif
+#endif
+
 #include <unistd.h>
 #include <stdio.h>
 #include <sys/stat.h>
index cd87430..74ec8c0 100644 (file)
@@ -208,7 +208,7 @@ static int excluded(const char *pathname)
 
 struct nond_on_fs {
        int len;
-       char name[0];
+       char name[FLEX_ARRAY]; /* more */
 };
 
 static struct nond_on_fs **dir;
index cf5931a..1577f74 100644 (file)
--- a/object.c
+++ b/object.c
@@ -1,8 +1,8 @@
+#include "cache.h"
 #include "object.h"
 #include "blob.h"
 #include "tree.h"
 #include "commit.h"
-#include "cache.h"
 #include "tag.h"
 
 struct object **objs;
index 336d986..0e76182 100644 (file)
--- a/object.h
+++ b/object.h
@@ -9,7 +9,7 @@ struct object_list {
 
 struct object_refs {
        unsigned count;
-       struct object *ref[0];
+       struct object *ref[FLEX_ARRAY]; /* more */
 };
 
 struct object {
index 92878ec..ce986fe 100644 (file)
@@ -24,7 +24,7 @@ struct command {
        unsigned char updated;
        unsigned char old_sha1[20];
        unsigned char new_sha1[20];
-       char ref_name[0];
+       char ref_name[FLEX_ARRAY]; /* more */
 };
 
 static struct command *commands = NULL;
diff --git a/tag.c b/tag.c
index 61ac434..ac0e573 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -1,5 +1,5 @@
-#include "tag.h"
 #include "cache.h"
+#include "tag.h"
 
 const char *tag_type = "tag";
 
diff --git a/tree.c b/tree.c
index e7a7b71..dc1c41e 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -1,8 +1,8 @@
+#include "cache.h"
 #include "tree.h"
 #include "blob.h"
 #include "commit.h"
 #include "tag.h"
-#include "cache.h"
 #include <stdlib.h>
 
 const char *tree_type = "tree";