From: Al Viro <viro@ZenIV.linux.org.uk>
To: Christopher Li <sparse@chrisli.org>
Cc: linux-sparse@vger.kernel.org
Subject: Re: fun with declarations and definitions
Date: Tue, 3 Feb 2009 04:13:17 +0000 [thread overview]
Message-ID: <20090203041317.GH28946@ZenIV.linux.org.uk> (raw)
In-Reply-To: <70318cbf0902021907w634ffc6dm693022b23a0eabfc@mail.gmail.com>
On Mon, Feb 02, 2009 at 07:07:24PM -0800, Christopher Li wrote:
> On Sun, Feb 1, 2009 at 11:30 PM, Al Viro <viro@zeniv.linux.org.uk> wrote:
> > Anyway, proposed patch for (1) follows:
>
> I read the patch, seems reasonable. It is only solve the inline case though.
> The more generic problem still exist, symbol look up between partial
> prototype declare and the real declare will get symbol with partial
> information.
... and unfortunately, that's what we _have_ to do. Reason: behaviour
of typeof(). Example:
extern int a[];
int a[__builtin_types_compatible_p(typeof(a),int [3]) + 3]; /* 4 */
int b[__builtin_types_compatible_p(typeof(a),int [3]) + 3]; /* 3 */
Similar for
extern int a[]; /* a is int [] */
typedef typeof(a) A; /* A is int [] _AND_ _WILL_ _REMAIN_ _SO_ */
int a[10]; /* a is int [10] now */
A b; /* int [] */
int b[1]; /* no problem */
Similar applies for functions getting pointers to functions, etc. - having
the type refined by subsequent declaration is not retroactive.
Mind you, we are not doing composite types in any useful way and _that_ is
where we ought to change things. Subsequent declarations should pick
the additional type information; we do propagate the inline definition
back to the call sites, provided that we had the function declared inline
before those. However, the type information should _not_ be spread back.
And it's not just due to typeof (I suspect that honest attempt to define
its semantics in presense of back-propagation like that will end up to
be Turing-complete, but even if it is decidable it's prohibitively hard).
Note that we do have similar effects in standard C - e.g.
extern int a[];
void f(void)
{
extern int a[24];
memset(a, 0, sizeof(a)); /* OK */
}
void g(void)
{
memset(a, 0, sizeof(a)); /* error - sizeof(a) is hidden from us here */
}
doesn't involve any extensions and having it barf on the second memset call
there is certainly intended behaviour.
next prev parent reply other threads:[~2009-02-03 4:13 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-02 7:30 fun with declarations and definitions Al Viro
2009-02-02 20:17 ` Christopher Li
2009-02-02 20:58 ` Al Viro
2009-02-02 22:25 ` Christopher Li
2009-02-03 3:07 ` Christopher Li
2009-02-03 4:13 ` Al Viro [this message]
2009-02-05 18:40 ` Christopher Li
2009-02-05 18:47 ` Derek M Jones
2009-02-05 20:28 ` Al Viro
2009-02-05 21:19 ` Al Viro
2009-02-06 5:36 ` Al Viro
2009-02-09 7:52 ` Christopher Li
2009-02-09 8:54 ` Al Viro
2009-02-05 22:41 ` Christopher Li
2009-02-05 23:22 ` Al Viro
2009-02-03 4:41 ` Al Viro
2009-02-03 6:28 ` Ralf Wildenhues
2009-02-05 18:52 ` Christopher Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090203041317.GH28946@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=linux-sparse@vger.kernel.org \
--cc=sparse@chrisli.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.