This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: rfc: macros accepting constructors
- From: Daniel Berlin <dberlin at dberlin dot org>
- To: Tim Hollebeek <tim at hollebeek dot com>
- Cc: Aldy Hernandez <aldyh at redhat dot com>,Joern Rennecke <joern dot rennecke at superh dot com>,Andreas Schwab <schwab at suse dot de>, <jason at redhat dot com>,<gcc at gcc dot gnu dot org>, <geoffk at redhat dot com>
- Date: Thu, 27 Jun 2002 13:22:19 -0400 (EDT)
- Subject: Re: rfc: macros accepting constructors
On Thu, 27 Jun 2002, Tim Hollebeek wrote:
> On Thu, Jun 27, 2002 at 10:02:32AM -0700, Aldy Hernandez wrote:
> >
> > > Perhaps the best suggestion (if anything is desirable) is to modify
> > > grammar so that ()'s are allowed around any grammar element which is
> > > surrounded by {}'s. Then all you have to do is remember to use ({ and
> >
> > this already works.
>
> I think you misunderstood. The part of the grammar I was proposing to
> modify was the C grammar, not the preprocessor grammar. What I suggested
> most definitely does NOT work right now:
>
> d1.c: void foo(void) ({ int x, y; })
> d2.c: int x[2] = ({ 0, 0 });
>
> d1.c:1: parse error before `{'
> d2.c:1: braced-group within expression allowed only inside a function
>
> > but foo({1,2}) doesn't.
>
> What I'm proposing would allow foo({1,2}) to safely be rewritten as
> foo(({1,2})) regardless of how the { ends up getting used.
This conflicts with statement expressions (a gcc extension), probably
irreconciably.
({1,2}) is an almost valid statement expression with the value "2".
(It's invalid because you don't have a semicolon at the end of the 2)
Thus, foo(({1,2;})) would be equivalent to foo(2).
Try it, you'll get a "too many arguments" error if you have "void
foo(void)", rather than some other weird error.
You can't reconcile (({})) with statement expressions, unless you are
going to do something hackish like distinguish based on the
presence of a semicolon.
--Dan
>
> -Tim
>
>
>