From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29518 invoked by alias); 2 Oct 2002 09:46:05 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 29468 invoked by uid 71); 2 Oct 2002 09:46:03 -0000 Resent-Date: 2 Oct 2002 09:46:03 -0000 Resent-Message-ID: <20021002094603.29467.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, Peter Breitenlohner Received: (qmail 27174 invoked from network); 2 Oct 2002 09:44:55 -0000 Received: from unknown (HELO iwsrz5.mppmu.mpg.de) (134.107.2.78) by sources.redhat.com with SMTP; 2 Oct 2002 09:44:55 -0000 Received: from pcl321.mppmu.mpg.de (pcl321.mppmu.mpg.de [134.107.3.54]) by iwsrz5.mppmu.mpg.de (Postfix) with ESMTP id 614BE3266; Wed, 2 Oct 2002 11:44:54 +0200 (DFT) Received: from pcl321.mppmu.mpg.de (localhost [127.0.0.1]) by pcl321.mppmu.mpg.de (8.12.2/8.12.2) with ESMTP id g929isDN011652; Wed, 2 Oct 2002 11:44:54 +0200 Received: (from peb@localhost) by pcl321.mppmu.mpg.de (8.12.2/8.12.2/Submit) id g929irov011651; Wed, 2 Oct 2002 11:44:53 +0200 Message-Id: <200210020944.g929irov011651@pcl321.mppmu.mpg.de> Date: Wed, 02 Oct 2002 02:46:00 -0000 From: Peter Breitenlohner To: gcc-gnats@gcc.gnu.org Cc: Peter Breitenlohner X-Send-Pr-Version: 3.113 Subject: preprocessor/8120: cpp concatenation doesn't work as described X-SW-Source: 2002-10/txt/msg00044.txt.bz2 List-Id: >Number: 8120 >Category: preprocessor >Synopsis: cpp concatenation doesn't work as described >Confidential: no >Severity: non-critical >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Wed Oct 02 02:46:01 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Peter Breitenlohner >Release: 3.2 >Organization: Max-Planck-Institut fuer Physik, Munich, Germany >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 >Description: 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 "" # 1 "" # 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). >How-To-Repeat: See above >Fix: See above >Release-Note: >Audit-Trail: >Unformatted: