This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/26581] New: incomplete (unsized) static array types cannot be completed
- From: "bernard at brenda-arkle dot demon dot co dot uk" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 6 Mar 2006 13:33:31 -0000
- Subject: [Bug c/26581] New: incomplete (unsized) static array types cannot be completed
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
If this is (as I am fairly sure) a bug, then it will
surely be a bug in the C front end, and as such be
architecture-independent.
The behaviour here complained of is peculiar to -pedantic,
which chucks an error for what I believe is correct code.
It's not even a warning otherwise, and I think rightly.
The behaviour is seen in gcc-4.0.2 and gcc-4.1, an
may well be older, as I have only recently started to use
-pedantic by default.
BS ISO/IEC 9899:1999 6.2.5 para.22 (first two sentences)
An array type of unknown size is an incomplete type. It is completed, for an
identifier of
that type, by specifying the size in a later declaration (with internal or
external linkage).
There's a great deal of murk in the Standard, some of which is relevant, but
in this cases at least, m'lud, the law is clear. Just as one may have
extern int thingy1[];
extern int thingy1[1];
one may have (with file scope, not block scope)
static int thingy2[];
static int thingy2[1];
gcc is happy with the 'extern' version, but not with the 'static' ones:
it gags, claiming that the first declaration is bad ("array size missing")
and the second is inconsistent with it ("conflicting types").
Perhaps the much stricter rules for block-scope declarations confused
the implementers? Specifically, objects other than function parameters
declared in a block which are not explicitly given the storage-class
'extern' have no linkage (Standard 6.2.2 para. 6), and an object with
no linkage may not have an incomplete type declaration (6.7 para. 7).
The reason for this restriction escapes me (why on earth not allow
deferred type completion here too?).
This is not the end of the story, but I'm steering clear of the
full horrors of 'extern' in this particular bug report.
I have not found a comparable problem with other incomplete types
(pointers to incompletely defined struct types, &c.), irrespective
of linkage.
Bernard Leak
--
What's wrong with a recursive dmalloc, anyway?
--
Summary: incomplete (unsized) static array types cannot be
completed
Product: gcc
Version: 4.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: bernard at brenda-arkle dot demon dot co dot uk
GCC build triplet: (same)
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: (same)
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26581