This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: preprocessor token pasting, 2.95 vs 3.0


On Wed, 20 Jun 2001, Neil Booth wrote:

> > ../test.h:32:9: warning: pasting "bar2" and "." does not give a valid
> > preprocessing token
>
> CPP is correct, and the message is pretty clear, at least if you
> understand what the semantics of ## really are.
>
> I suspect you have a macro somewhere that is doing
>
> #define foo(A, B) foo.A ## B ## .baz

except B is always a number.. see below.

> In this particular case, the 2nd ## is not helping and you should just
> delete it.

gcc 3.0 errors if you do that.

sorry if this was unclear.  The code has some monstrous multi-line macros.
the portion in question was originally this:

#define A(x)  do { \
   func.x ## 2.clear(); \
   } while(0)

gcc 2.95 has no problems pasting func.x with 2.clear(), but gcc 3 does
(error "invalid suffix on floating constant", it thinks 2 is a number,
since functions can't start with numeric digits and it hasn't done the
pasting yet).  gcc 2.95's interpretation makes sense, gcc 3.0 doesn't.
Nobody cares if it's a number, if it's right after a ##, it's getting
pasted onto something else so any ideas about what it is or what it's part
of should be suspended until after the pasting.

with gcc 3.0, changing to "func.x ## 2 ## .clear();" works, but gives
the error: (presuming foo is passed to the macro)

../test.h:32:9: warning: pasting "foo" and "." does not give a valid
preprocessing token

so e.g. if foo is passed as x, is there any way to do the equivalent of
func.foo2.clear();
without getting that warning, and if it's changed to an error, how would
you do something like that?


simple test code:  try compiling this with gcc 2.95.x and gcc 3... this
won't compile at all with gcc 3, compiles perfectly with 2.95, but
illustrates the point i think.


#include <list>
#define T(x) (func.x ## 2.clear())

struct a {
  std::list<int> foo2;
};

int main(int argc, char **argv) {
  struct a func;
  T(foo);
  return(0);
}

with gcc 3.0 you'll find it doesn't compile, and requires you to change
the macro to
... ## 2 ## .clear())

and you still get the warning, which is what I was trying to find a way
around...


justin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]