This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR preprocessor/19475
- From: Jakub Jelinek <jakub at redhat dot com>
- To: jsm at polyomino dot org dot uk, zack at codesourcery dot com
- Cc: gcc-patches at gcc dot gnu dot org, gcc-bugzilla at gcc dot gnu dot org
- Date: Tue, 5 Apr 2005 06:17:43 -0400
- Subject: [PATCH] Fix PR preprocessor/19475
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
This patch fixes PR preprocessor/19475 by issuing just warning, not pedwarn,
for < ISO C99 if there is no whitespace between macro definition and
replacement, but replacement starts with a basic character set character.
Ok to commit?
Unfortunately, the testcases provided fail in dejagnu (although the
preprocessor behaviour is correct).
Executing on host: /usr/src/gcc/obj/gcc/xgcc -B/usr/src/gcc/obj/gcc/ /usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c -std=iso9899:1990 -pedantic-errors -E -o macspace1.i (timeout = 300)
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:5:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:6:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:7:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:8:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:9:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:10:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:11:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:12:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:13:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:14:10: warning: missing whitespace after the macro name
/usr/src/gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c:15:10: warning: missing whitespace after the macro name
...
PASS: gcc.dg/cpp/macspace1.c (test for warnings, line 5)
PASS: gcc.dg/cpp/macspace1.c (test for warnings, line 6)
PASS: gcc.dg/cpp/macspace1.c (test for warnings, line 7)
PASS: gcc.dg/cpp/macspace1.c (test for warnings, line 8)
PASS: gcc.dg/cpp/macspace1.c (test for warnings, line 9)
PASS: gcc.dg/cpp/macspace1.c (test for warnings, line 10)
PASS: gcc.dg/cpp/macspace1.c (test for warnings, line 11)
FAIL: gcc.dg/cpp/macspace1.c (test for warnings, line 12)
FAIL: gcc.dg/cpp/macspace1.c (test for warnings, line 13)
FAIL: gcc.dg/cpp/macspace1.c (test for warnings, line 14)
FAIL: gcc.dg/cpp/macspace1.c (test for warnings, line 15)
...
Is there some limitation on how many bytes or error messages
dejagnu groks or something?
When I split the tests into 6 warnings (resp. errors) chunks, it succeeds.
I'm using dejagnu 1.4.4, expect 5.42.1 and tcl 8.4.7.
2005-04-05 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/19475
* libcpp/macro.c (create_iso_definition): For < ISO C99, don't
pedwarn if there is no whitespace between macro name and its
replacement, but the replacement starts with a basic character
set character.
* gcc.dg/cpp/macspace1.c: New test.
* gcc.dg/cpp/macspace2.c: New test.
--- gcc/libcpp/macro.c.jj 2005-03-17 13:39:12.000000000 +0100
+++ gcc/libcpp/macro.c 2005-04-05 11:39:57.000000000 +0200
@@ -1430,8 +1430,39 @@ create_iso_definition (cpp_reader *pfile
macro->fun_like = 1;
}
else if (ctoken->type != CPP_EOF && !(ctoken->flags & PREV_WHITE))
- cpp_error (pfile, CPP_DL_PEDWARN,
- "ISO C requires whitespace after the macro name");
+ {
+ /* While ISO C99 requires whitespace before replacement text
+ in a macro definition, ISO C90 with TC1 allows there characters
+ from the basic source character set. */
+ if (CPP_OPTION (pfile, c99))
+ cpp_error (pfile, CPP_DL_PEDWARN,
+ "ISO C99 requires whitespace after the macro name");
+ else
+ {
+ int warntype = CPP_DL_WARNING;
+ switch (ctoken->type)
+ {
+ case CPP_ATSIGN:
+ case CPP_AT_NAME:
+ case CPP_OBJC_STRING:
+ /* '@' is not in basic character set. */
+ warntype = CPP_DL_PEDWARN;
+ break;
+ case CPP_OTHER:
+ /* Basic character set sans letters, digits and _. */
+ if (strchr ("!\"#%&'()*+,-./:;<=>?[\\]^{|}~",
+ ctoken->val.str.text[0]) == NULL)
+ warntype = CPP_DL_PEDWARN;
+ break;
+ default:
+ /* All other tokens start with a character from basic
+ character set. */
+ break;
+ }
+ cpp_error (pfile, warntype,
+ "missing whitespace after the macro name");
+ }
+ }
if (macro->fun_like)
token = lex_expansion_token (pfile, macro);
--- gcc/gcc/testsuite/gcc.dg/cpp/macspace2.c.jj 2005-04-05 11:45:18.000000000 +0200
+++ gcc/gcc/testsuite/gcc.dg/cpp/macspace2.c 2005-04-05 11:46:41.000000000 +0200
@@ -0,0 +1,65 @@
+/* PR preprocessor/19475 */
+/* { dg-do preprocess } */
+/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
+
+#define a! /* { dg-error "requires whitespace" } */
+#define b" /* { dg-error "requires whitespace" } */
+#define c# /* { dg-error "requires whitespace" } */
+#define d% /* { dg-error "requires whitespace" } */
+#define e& /* { dg-error "requires whitespace" } */
+#define f' /* { dg-error "requires whitespace" } */
+#define g) /* { dg-error "requires whitespace" } */
+#define h* /* { dg-error "requires whitespace" } */
+#define i+ /* { dg-error "requires whitespace" } */
+#define j, /* { dg-error "requires whitespace" } */
+#define k- /* { dg-error "requires whitespace" } */
+#define l. /* { dg-error "requires whitespace" } */
+#define m/ /* { dg-error "requires whitespace" } */
+#define n: /* { dg-error "requires whitespace" } */
+#define o; /* { dg-error "requires whitespace" } */
+#define p< /* { dg-error "requires whitespace" } */
+#define q= /* { dg-error "requires whitespace" } */
+#define r> /* { dg-error "requires whitespace" } */
+#define s? /* { dg-error "requires whitespace" } */
+#define t[ /* { dg-error "requires whitespace" } */
+#define u] /* { dg-error "requires whitespace" } */
+#define v^ /* { dg-error "requires whitespace" } */
+#define w{ /* { dg-error "requires whitespace" } */
+#define x| /* { dg-error "requires whitespace" } */
+#define y} /* { dg-error "requires whitespace" } */
+#define z~ /* { dg-error "requires whitespace" } */
+#define A>> /* { dg-error "requires whitespace" } */
+#define B<< /* { dg-error "requires whitespace" } */
+#define C<? /* { dg-error "requires whitespace" } */
+#define D>? /* { dg-error "requires whitespace" } */
+#define E&& /* { dg-error "requires whitespace" } */
+#define F|| /* { dg-error "requires whitespace" } */
+#define G== /* { dg-error "requires whitespace" } */
+#define H!= /* { dg-error "requires whitespace" } */
+#define I>= /* { dg-error "requires whitespace" } */
+#define J<= /* { dg-error "requires whitespace" } */
+#define K+= /* { dg-error "requires whitespace" } */
+#define L-= /* { dg-error "requires whitespace" } */
+#define M*= /* { dg-error "requires whitespace" } */
+#define N/= /* { dg-error "requires whitespace" } */
+#define O%= /* { dg-error "requires whitespace" } */
+#define P&= /* { dg-error "requires whitespace" } */
+#define Q|= /* { dg-error "requires whitespace" } */
+#define R^= /* { dg-error "requires whitespace" } */
+#define S>>= /* { dg-error "requires whitespace" } */
+#define T<<= /* { dg-error "requires whitespace" } */
+#define U<?= /* { dg-error "requires whitespace" } */
+#define V>?= /* { dg-error "requires whitespace" } */
+#define W... /* { dg-error "requires whitespace" } */
+#define X++ /* { dg-error "requires whitespace" } */
+#define Y-- /* { dg-error "requires whitespace" } */
+#define Z-> /* { dg-error "requires whitespace" } */
+#define aa:: /* { dg-error "requires whitespace" } */
+#define ab->* /* { dg-error "requires whitespace" } */
+#define ac.* /* { dg-error "requires whitespace" } */
+#define ad\x /* { dg-error "requires whitespace" } */
+#define ae\\x /* { dg-error "requires whitespace" } */
+#define af'1' /* { dg-error "requires whitespace" } */
+#define ag"abc" /* { dg-error "requires whitespace" } */
+
+int dummy;
--- gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c.jj 2005-04-05 11:45:18.000000000 +0200
+++ gcc/gcc/testsuite/gcc.dg/cpp/macspace1.c 2005-04-05 11:54:16.000000000 +0200
@@ -0,0 +1,65 @@
+/* PR preprocessor/19475 */
+/* { dg-do preprocess } */
+/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */
+
+#define a! /* { dg-warning "missing whitespace" } */
+#define b" /* { dg-warning "missing whitespace" } */
+#define c# /* { dg-warning "missing whitespace" } */
+#define d% /* { dg-warning "missing whitespace" } */
+#define e& /* { dg-warning "missing whitespace" } */
+#define f' /* { dg-warning "missing whitespace" } */
+#define g) /* { dg-warning "missing whitespace" } */
+#define h* /* { dg-warning "missing whitespace" } */
+#define i+ /* { dg-warning "missing whitespace" } */
+#define j, /* { dg-warning "missing whitespace" } */
+#define k- /* { dg-warning "missing whitespace" } */
+#define l. /* { dg-warning "missing whitespace" } */
+#define m/ /* { dg-warning "missing whitespace" } */
+#define n: /* { dg-warning "missing whitespace" } */
+#define o; /* { dg-warning "missing whitespace" } */
+#define p< /* { dg-warning "missing whitespace" } */
+#define q= /* { dg-warning "missing whitespace" } */
+#define r> /* { dg-warning "missing whitespace" } */
+#define s? /* { dg-warning "missing whitespace" } */
+#define t[ /* { dg-warning "missing whitespace" } */
+#define u] /* { dg-warning "missing whitespace" } */
+#define v^ /* { dg-warning "missing whitespace" } */
+#define w{ /* { dg-warning "missing whitespace" } */
+#define x| /* { dg-warning "missing whitespace" } */
+#define y} /* { dg-warning "missing whitespace" } */
+#define z~ /* { dg-warning "missing whitespace" } */
+#define A>> /* { dg-warning "missing whitespace" } */
+#define B<< /* { dg-warning "missing whitespace" } */
+#define C<? /* { dg-warning "missing whitespace" } */
+#define D>? /* { dg-warning "missing whitespace" } */
+#define E&& /* { dg-warning "missing whitespace" } */
+#define F|| /* { dg-warning "missing whitespace" } */
+#define G== /* { dg-warning "missing whitespace" } */
+#define H!= /* { dg-warning "missing whitespace" } */
+#define I>= /* { dg-warning "missing whitespace" } */
+#define J<= /* { dg-warning "missing whitespace" } */
+#define K+= /* { dg-warning "missing whitespace" } */
+#define L-= /* { dg-warning "missing whitespace" } */
+#define M*= /* { dg-warning "missing whitespace" } */
+#define N/= /* { dg-warning "missing whitespace" } */
+#define O%= /* { dg-warning "missing whitespace" } */
+#define P&= /* { dg-warning "missing whitespace" } */
+#define Q|= /* { dg-warning "missing whitespace" } */
+#define R^= /* { dg-warning "missing whitespace" } */
+#define S>>= /* { dg-warning "missing whitespace" } */
+#define T<<= /* { dg-warning "missing whitespace" } */
+#define U<?= /* { dg-warning "missing whitespace" } */
+#define V>?= /* { dg-warning "missing whitespace" } */
+#define W... /* { dg-warning "missing whitespace" } */
+#define X++ /* { dg-warning "missing whitespace" } */
+#define Y-- /* { dg-warning "missing whitespace" } */
+#define Z-> /* { dg-warning "missing whitespace" } */
+#define aa:: /* { dg-warning "missing whitespace" } */
+#define ab->* /* { dg-warning "missing whitespace" } */
+#define ac.* /* { dg-warning "missing whitespace" } */
+#define ad\x /* { dg-warning "missing whitespace" } */
+#define ae\\x /* { dg-warning "missing whitespace" } */
+#define af'1' /* { dg-warning "missing whitespace" } */
+#define ag"abc" /* { dg-warning "missing whitespace" } */
+
+int dummy;
Jakub