Bug 8120 - cpp concatenation doesn't work as described
Summary: cpp concatenation doesn't work as described
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: preprocessor (show other bugs)
Version: 3.2
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2002-10-02 02:46 UTC by Peter Breitenlohner
Modified: 2003-07-25 17:33 UTC (History)
3 users (show)

See Also:
Host: i586-pc-linux-gnu
Target: i586-pc-linux-gnu
Build: i586-pc-linux-gnu
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Peter Breitenlohner 2002-10-02 02:46:01 UTC
cpp.info-> Implementation Details
	-> Obsolete Features
	-> Miscellaneous obsolete features
	-> Attempting to paste two tokens which together do not form
	   a valid preprocessing token.
Says (quoted literally):

The preprocessor currently warns about this and outputs the two
tokens adjacently, which is probably the behavior the programmer
intends.  It may not work in future, though.

Most of the time, when you get this warning, you will find that
`##' is being used superstitiously, to guard against whitespace
appearing between two tokens.  It is almost always safe to delete
the `##'.

(end quote)

I was using the following code, cut down to the bare essentials and
replacing `#include' by `include' in order to (a) get some output from the
preprocessor and (b) make visible what happens.
##################  start of input file bug.c  ####################
#define XXX_H(name) XXX_I(prefix_ ## name ## .h)
#define XXX_I(file) #file

include XXX_H(all)
###################  end of input file bug.c  #####################
The command `gcc -E bug.c -o bug.i' yields
##################  start of output file bug.i  ###################
# 1 "bug.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bug.c"



include "prefix_all .h"
###################  end of output file bug.i  ####################
together with the warning:
bug.c:4:18: warning: pasting "prefix_all" and "." does not give a valid
preprocessing token

The warning is in agreement with the above quote, but the output is not,
since the two tokens `prefix_all' and `.' are separated by a space (and
subsequently stringified).

This construct used to produce "prefix_all.h" with gcc-2.95.3 (without
warning). With gcc-3.1.1 and 3.2 I got the desired result (with a warning) when
I replaced `name ## .h' by `name ##.h' or by  `name##.h', but not with
`name## .h'. I would think something funny happens here with the handling of
whitespace!!

Of course, the second paragraph quoted above applies: `name ## .h' should
be replaced by `name.h' which equally works with gcc-2.95.3 and gcc-3.2
(without any warnings).

Release:
3.2

Environment:
System: Linux pcl321 2.4.17 #1 Sat Feb 23 15:19:54 CET 2002 i686 unknown
Architecture: i686

	
host: i586-pc-linux-gnu
build: i586-pc-linux-gnu
target: i586-pc-linux-gnu
configured with: ../gcc-3.2/configure --host=ix86-linux-gnulibc2 --prefix=/usr --disable-nls --enable-shared --enable-languages=c++,f77,objc --bindir=/ix86-linux-gnulibc2/bin

How-To-Repeat:
See above
Comment 1 Peter Breitenlohner 2002-10-02 02:46:01 UTC
Fix:
See above
Comment 2 Neil Booth 2002-10-04 23:08:38 UTC
From: Neil Booth <neil@daikokuya.co.uk>
To: Peter Breitenlohner <peb@mppmu.mpg.de>
Cc: gcc-gnats@gcc.gnu.org
Subject: Re: preprocessor/8120: cpp concatenation doesn't work as described
Date: Fri, 4 Oct 2002 23:08:38 +0100

 Peter Breitenlohner wrote:-
 
 > I was using the following code, cut down to the bare essentials and
 > replacing `#include' by `include' in order to (a) get some output from the
 > preprocessor and (b) make visible what happens.
 > ##################  start of input file bug.c  ####################
 > #define XXX_H(name) XXX_I(prefix_ ## name ## .h)
 > #define XXX_I(file) #file
 > 
 > include XXX_H(all)
 > ###################  end of input file bug.c  #####################
 > The command `gcc -E bug.c -o bug.i' yields
 > ##################  start of output file bug.i  ###################
 > # 1 "bug.c"
 > # 1 "<built-in>"
 > # 1 "<command line>"
 > # 1 "bug.c"
 > 
 > 
 > 
 > include "prefix_all .h"
 > ###################  end of output file bug.i  ####################
 > together with the warning:
 > bug.c:4:18: warning: pasting "prefix_all" and "." does not give a valid
 > preprocessing token
 > 
 > The warning is in agreement with the above quote, but the output is not,
 > since the two tokens `prefix_all' and `.' are separated by a space (and
 > subsequently stringified).
 > 
 > This construct used to produce "prefix_all.h" with gcc-2.95.3 (without
 > warning). With gcc-3.1.1 and 3.2 I got the desired result (with a warning) when
 > I replaced `name ## .h' by `name ##.h' or by  `name##.h', but not with
 > `name## .h'. I would think something funny happens here with the handling of
 > whitespace!!
 
 I will correct the documentation to say "gives undefined behaviour"
 shortly.  3.3 gives a hard error.  To get the result you want, remove the
 offending ##.
 
 Neil.
Comment 3 Neil Booth 2002-10-05 02:39:30 UTC
State-Changed-From-To: open->closed
State-Changed-Why: Documentation updated.
Comment 4 Neil Booth 2002-10-05 09:36:29 UTC
From: neil@gcc.gnu.org
To: gcc-gnats@gcc.gnu.org
Cc:  
Subject: preprocessor/8120
Date: 5 Oct 2002 09:36:29 -0000

 CVSROOT:	/cvs/gcc
 Module name:	gcc
 Branch: 	gcc-3_2-branch
 Changes by:	neil@gcc.gnu.org	2002-10-05 02:36:29
 
 Modified files:
 	gcc            : ChangeLog 
 	gcc/doc        : cpp.texi 
 
 Log message:
 	PR preprocessor/8120
 	* doc/cpp.texi: Update documentation of bad use of ##.
 
 Patches:
 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.13152.2.657.2.68&r2=1.13152.2.657.2.69
 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/doc/cpp.texi.diff?cvsroot=gcc&only_with_tag=gcc-3_2-branch&r1=1.24.2.3.4.2&r2=1.24.2.3.4.3