cppinit.c (cpp_post_options): Shut off macro expansion if -fpreprocessed.

* cppinit.c (cpp_post_options): Shut off macro expansion if
	-fpreprocessed.
	* cpplib.c (_cpp_handle_directive): If -fpreprocessed, accept
	IN_I directives only if the # is in column 1 and the directive
	name begins in column 2.
	* cppmain.c (scan_buffer): Insert a space between # and an
	identifier, when that identifier is a directive name.

	* tradcpp.c (struct file_buf): Add a pointer to the next entry
	in the header search path.
	(enum node_type): Add T_INCLUDE_NEXT.
	(directive_table): Add entry for include_next.
	(do_include_next): New function.
	(process_include): New routine, broken out of do_include.
	(finclude): Insert 'nhd' argument, to be copied into
	next_header_dir of the new buffer.
	(main): Adjust to match.
	* gsyslimits.h, limity.h: Un-indent #include_next.

testsuite:
	* gcc.dg/cpp/direct2.c: New test.
	* gcc.dg/cpp/direct2s.c: New test.

	* gcc.c-torture/execute/920730-1t.c: #undef __GNUC__ at head.

From-SVN: r41932
This commit is contained in:
Zack Weinberg 2001-05-10 00:07:23 +00:00
parent 6ebe3121aa
commit 6d4587f735
11 changed files with 314 additions and 78 deletions

View File

@ -1,3 +1,24 @@
2001-05-09 Zack Weinberg <zackw@stanford.edu>
* cppinit.c (cpp_post_options): Shut off macro expansion if
-fpreprocessed.
* cpplib.c (_cpp_handle_directive): If -fpreprocessed, accept
IN_I directives only if the # is in column 1 and the directive
name begins in column 2.
* cppmain.c (scan_buffer): Insert a space between # and an
identifier, when that identifier is a directive name.
* tradcpp.c (struct file_buf): Add a pointer to the next entry
in the header search path.
(enum node_type): Add T_INCLUDE_NEXT.
(directive_table): Add entry for include_next.
(do_include_next): New function.
(process_include): New routine, broken out of do_include.
(finclude): Insert 'nhd' argument, to be copied into
next_header_dir of the new buffer.
(main): Adjust to match.
* gsyslimits.h, limity.h: Un-indent #include_next.
2001-05-09 Joseph S. Myers <jsm28@cam.ac.uk>
* objc.texi: Move from ../libobjc/objc-features.texi. Adjust for
@ -466,7 +487,7 @@ Fri May 4 13:10:03 CEST 2001 Jan Hubicka <jh@suse.cz>
(REG_OK_FOR_INDEX_P): Use INT_REG_OK_FOR_INDEX_P.
(REG_OK_FOR_BASE_P): Use INT_REG_OK_FOR_BASE_P.
(LEGITIMATE_OFFSET_ADDRESS_P): Use INT_REG_OK_FOR_INDEX_P and
INT_REG_OK_FOR_BASE_P instead of REG_OK_FOR_INDEX_P and
INT_REG_OK_FOR_BASE_P instead of REG_OK_FOR_INDEX_P and
REG_OK_FOR_BASE_P. Take an additional parameter.
(LEGITIMATE_INDEXED_ADDRESS_P): Likeewise.
(LEGITIMATE_INDIRECT_ADDRESS_P): Likewise.

View File

@ -1716,6 +1716,11 @@ cpp_post_options (pfile)
if (CPP_OPTION (pfile, user_label_prefix) == NULL)
CPP_OPTION (pfile, user_label_prefix) = USER_LABEL_PREFIX;
/* Permanently disable macro expansion if we are rescanning
preprocessed text. */
if (CPP_OPTION (pfile, preprocessed))
pfile->state.prevent_expansion = 1;
/* We need to do this after option processing and before
cpp_start_read, as cppmain.c relies on the options->no_output to
set its callbacks correctly before calling cpp_start_read. */

View File

@ -311,7 +311,32 @@ _cpp_handle_directive (pfile, indented)
/* If we are rescanning preprocessed input, only directives tagged
with IN_I are honored, and the warnings below are suppressed. */
if (! CPP_OPTION (pfile, preprocessed) || dir->flags & IN_I)
if (CPP_OPTION (pfile, preprocessed))
{
/* Kluge alert. In order to be sure that code like this
#define HASH #
HASH define foo bar
does not cause '#define foo bar' to get executed when
compiled with -save-temps, we recognize directives in
-fpreprocessed mode only if the # is in column 1 and the
directive name starts in column 2. This output can only
be generated by the directive callbacks in cppmain.c (see
also the special case in scan_buffer). */
if (dir->flags & IN_I && !indented && !(dname.flags & PREV_WHITE))
(*dir->handler) (pfile);
/* That check misses '# 123' linemarkers. Let them through too. */
else if (dname.type == CPP_NUMBER)
(*dir->handler) (pfile);
else
{
/* We don't want to process this directive. Put back the
tokens so caller will see them (and issue an error,
probably). */
_cpp_push_token (pfile, &dname, &pfile->directive_pos);
skip = 0;
}
}
else
{
/* Traditionally, a directive is ignored unless its # is in
column 1. Therefore in code intended to work with K+R

View File

@ -238,6 +238,13 @@ scan_buffer (pfile)
== AVOID_LPASTE
&& cpp_avoid_paste (pfile, &tokens[1 - index], token))
token->flags |= PREV_WHITE;
/* Special case '# <directive name>': insert a space between
the # and the token. This will prevent it from being
treated as a directive when this code is re-preprocessed.
XXX Should do this only at the beginning of a line, but how? */
else if (token->type == CPP_NAME && token->val.node->directive_index
&& tokens[1 - index].type == CPP_HASH)
token->flags |= PREV_WHITE;
cpp_output_token (token, print.outf);
print.printed = 1;

View File

@ -4,5 +4,5 @@
instead of this text. */
#define _GCC_NEXT_LIMITS_H /* tell gcc's limits.h to recurse */
#include_next <limits.h>
#include_next <limits.h>
#undef _GCC_NEXT_LIMITS_H

View File

@ -4,7 +4,7 @@
#else /* not _GCC_LIMITS_H_ */
#ifdef _GCC_NEXT_LIMITS_H
#include_next <limits.h> /* recurse down to the real one */
#include_next <limits.h> /* recurse down to the real one */
#endif
#endif /* not _GCC_LIMITS_H_ */

View File

@ -1,3 +1,10 @@
2001-05-09 Zack Weinberg <zackw@stanford.edu>
* gcc.dg/cpp/direct2.c: New test.
* gcc.dg/cpp/direct2s.c: New test.
* gcc.c-torture/execute/920730-1t.c: #undef __GNUC__ at head.
2001-05-07 Mark Mitchell <mark@codesourcery.com>
* g++.old-deja/g++.other/op2.C: Don't use `glob' as a variable.
@ -26,7 +33,7 @@
* lib/g++.exp (g++_include_flags): Don't use any special flags
if TESTING_IN_BUILD_TREE is not defined.
(g++_init): Use a plain 'c++' as the compiler if
(g++_init): Use a plain 'c++' as the compiler if
TESTING_IN_BUILD_TREEE is not defined.
2001-05-02 Jakub Jelinek <jakub@redhat.com>
@ -187,7 +194,7 @@ Thu Apr 26 11:15:12 2001 Jeffrey A Law (law@cygnus.com)
* gcc.dg/wtr-conversion-1.c: Don't test for width changes.
2001-04-12 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.abi/primary3.C (main): Correct expected layout.
* g++.old-deja/g++.abi/crash1.C: New test.
@ -205,7 +212,7 @@ Thu Apr 26 11:15:12 2001 Jeffrey A Law (law@cygnus.com)
22001-04-11 Peter Schmid <schmid@snake.iap.physik.tu-darmstadt.de>
* g++.old-deja/g++.robertl/eb42.C: Same.
* g++.old-deja/g++.robertl/eb42.C: Same.
001-04-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
@ -470,9 +477,9 @@ Fri Apr 6 15:36:15 2001 J"orn Rennecke <amylaar@redhat.com>
2001-03-06 Zack Weinberg <zackw@stanford.edu>
* objc/execute/string1.m, objc/execute/string2.m: Compare the
result of -cString against what we expect it to be; don't just
print it out for no one to read.
* objc/execute/string1.m, objc/execute/string2.m: Compare the
result of -cString against what we expect it to be; don't just
print it out for no one to read.
* objc/execute/string3.m, objc/execute/string4.m: New tests.
Based on testcases provided by Nicola Pero.
@ -546,8 +553,8 @@ Wed Feb 21 12:38:22 2001 Ovidiu Predescu <ovidiu@cup.hp.com>
2001-02-21 Gabriel Dos Reis <gdr@merlin.codesourcery.com>
* g++.old-deja/g++.other/lookup22.C: New test.
* g++.old-deja/g++.other/lookup22.C: New test.
2001-02-19 Zack Weinberg <zackw@stanford.edu>
* g77.dg: New directory.
@ -562,7 +569,7 @@ Wed Feb 21 12:38:22 2001 Ovidiu Predescu <ovidiu@cup.hp.com>
2001-02-16 Gabriel Dos Reis <gdr@codesourcery.com>
* g++.old-deja/g++.other/decl9.C: New test.
2001-02-16 Jakub Jelinek <jakub@redhat.com>
* g++.old-deja/g++.other/init16.C: Update the test so that it does
@ -676,7 +683,7 @@ Wed Feb 7 09:54:47 2001 Ovidiu Predescu <ovidiu@cup.hp.com>
2001-02-06 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/avoidpaste1.c: Update.
* gcc.dg/cpp/avoidpaste1.c: Update.
Tue Feb 5 8:53:33 2001 Ovidiu Predescu <ovidiu@cup.hp.com>
@ -718,7 +725,7 @@ Tue Feb 5 8:53:33 2001 Ovidiu Predescu <ovidiu@cup.hp.com>
2001-02-01 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/avoidpaste2.c: New tests.
* gcc.dg/cpp/avoidpaste2.c: New tests.
2001-01-31 Jakub Jelinek <jakub@redhat.com>
@ -739,12 +746,12 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke <amylaar@redhat.com>
2001-01-31 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/tr-warn1.c: Add tests.
* gcc.dg/cpp/tr-warn1.c: Add tests.
2001-01-31 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/avoidpaste1.c: Update.
* gcc.dg/cpp/paste4.c: Update.
* gcc.dg/cpp/avoidpaste1.c: Update.
* gcc.dg/cpp/paste4.c: Update.
2001-01-30 Jeffrey Oldham <oldham@codesourcery.com>
@ -770,7 +777,7 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke <amylaar@redhat.com>
2001-01-28 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/avoidpaste1.c: Test case.
* gcc.dg/cpp/avoidpaste1.c: Test case.
2001-01-28 Jakub Jelinek <jakub@redhat.com>
@ -886,7 +893,7 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke <amylaar@redhat.com>
2001-01-18 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/assembl2.S: New test case.
* gcc.dg/cpp/assembl2.S: New test case.
2001-01-17 Jeffrey Oldham <oldham@codesourcery.com>
@ -926,9 +933,9 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke <amylaar@redhat.com>
2001-01-15 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/if-2.c: Comment out occasionally bogus test; we
have an equivalent working one below it.
* gcc.dg/cpp/if-2.c: Comment out occasionally bogus test; we
have an equivalent working one below it.
2001-01-14 Jeffrey Oldham <oldham@codesourcery.com>
* g++.old-deja/g++.ext/instantiate2.C: Add explanatory comment.
@ -970,8 +977,8 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke <amylaar@redhat.com>
2001-01-13 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/widestr1.c: Update.
* gcc.dg/cpp/prag-imp.c: Remove.
* gcc.dg/cpp/widestr1.c: Update.
* gcc.dg/cpp/prag-imp.c: Remove.
2001-01-12 Jakub Jelinek <jakub@redhat.com>
@ -1018,7 +1025,7 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke <amylaar@redhat.com>
2001-01-10 Alan Lehotsky <lehotsky@tiac.net>
* gcc.dg/20000926-1.c: Parameterize for machines with 16-bit ints.
2001-01-10 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.pt/error3.C: New test.
@ -1034,17 +1041,17 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke <amylaar@redhat.com>
2001-01-08 Jonathan Larmour <jlarmour@redhat.com>
* gcc.dg/20000419-2.c: Move to "special" subdirectory.
* gcc.dg/special/20000419-2.c: New file. Identical to above.
* gcc.dg/special/special.exp: New test driver which will check
for alias support for the above test.
* gcc.dg/special/20000419-2.c: New file. Identical to above.
* gcc.dg/special/special.exp: New test driver which will check
for alias support for the above test.
2001-01-09 Alan Lehotsky <lehotsky@tiac.net>
* gcc.c-torture/execute/921202-1.c: Use STACK_SIZE to avoid
problems on small machines.
* gcc.c-torture/execute/920730-1.c: Use values from <limits.h> to
parameterize.
parameterize.
2001-01-09 Jeffrey Oldham <oldham@codesourcery.com>
* g++.old-deja/g++.ext/instantiate2.C: ERROR line should fail for
@ -1229,7 +1236,7 @@ Thu Jan 4 13:54:11 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-01-03 Jeffrey Oldham <oldham@codesourcery.com>
* lib/target-supports.exp (check_alias_available): Modified to
indicate aliases not supported if only weak aliases are supported.
indicate aliases not supported if only weak aliases are supported.
2001-01-03 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
@ -1362,12 +1369,12 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-17 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/cpp/multiline.c: New test.
* gcc.dg/cpp/multiline.c: New test.
2000-12-17 Neil Booth <neil@daikokuya.demon.co.uk>
* g++.old-deja/g++.other/syshdr1.C: Update.
* gcc.dg/cpp/lineflags.c: Remove temporarily.
* g++.old-deja/g++.other/syshdr1.C: Update.
* gcc.dg/cpp/lineflags.c: Remove temporarily.
2000-12-15 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
@ -1415,7 +1422,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-11 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/if-2.c: Separate tests so that which failed is obvious.
* gcc.dg/cpp/if-2.c: Separate tests so that which failed is obvious.
2000-12-09 Joseph S. Myers <jsm28@cam.ac.uk>
@ -1423,10 +1430,10 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-09 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/lineflags.c: New tests.
* gcc.dg/cpp/poison.c: Update.
* gcc.dg/cpp/redef2.c: Update.
* gcc.dg/cpp/skipping.c: New test.
* gcc.dg/cpp/lineflags.c: New tests.
* gcc.dg/cpp/poison.c: Update.
* gcc.dg/cpp/redef2.c: Update.
* gcc.dg/cpp/skipping.c: New test.
2000-12-07 Geoffrey Keating <geoffk@redhat.com>
@ -1434,12 +1441,12 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-07 Neil Booth <neilb@earthling.net>
* gcc.dg/wtr-aggr-init-1.c, wtr-escape-1.c, wtr-int-type-1.c,
wtr-label-1.c, wtr-static-1.c, wtr-strcat-1.c, wtr-suffix-1.c,
wtr-switch-1.c, wtr-unary-plus-1.c, wtr-union-init-1.c
wtr-union-init-2.c, wtr-union-init-3.c: Update.
* gcc.dg/cpp/extratokens.c, tr-warn4.c, tr-warn5.c, tr-warn6.c:
Update.
* gcc.dg/wtr-aggr-init-1.c, wtr-escape-1.c, wtr-int-type-1.c,
wtr-label-1.c, wtr-static-1.c, wtr-strcat-1.c, wtr-suffix-1.c,
wtr-switch-1.c, wtr-unary-plus-1.c, wtr-union-init-1.c
wtr-union-init-2.c, wtr-union-init-3.c: Update.
* gcc.dg/cpp/extratokens.c, tr-warn4.c, tr-warn5.c, tr-warn6.c:
Update.
2000-12-07 Joseph S. Myers <jsm28@cam.ac.uk>
@ -1514,8 +1521,8 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-04 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/assert_trad1.c, assert_trad2.c, assert_trad3.c:
New tests.
* gcc.dg/cpp/assert_trad1.c, assert_trad2.c, assert_trad3.c:
New tests.
2000-12-03 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
@ -1528,7 +1535,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-03 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/macro6.c: New test cases.
* gcc.dg/cpp/macro6.c: New test cases.
2000-12-02 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
@ -1548,19 +1555,19 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-02 Neil Booth <neilb@earthling.net>
* g++.old-deja/g++.other/externC4.C,
g++.old-deja/g++.other/friend10.C: New tests.
* g++.old-deja/g++.other/externC4.C,
g++.old-deja/g++.other/friend10.C: New tests.
2000-12-02 Neil Booth <neilb@earthling.net>
* g++.old-deja/g++.other/instan2.C
* g++.old-deja/g++.other/instan3.C: New test.
* g++.old-deja/g++.other/instan2.C
* g++.old-deja/g++.other/instan3.C: New test.
2000-12-02 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/c++98.c,c++98-pedantic.c,c89.c,c89-pedantic.c,
c94.c,c94-pedantic.c,c99.c,c99-pedantic.c,gnuc89.c,gnuc89-pedantic.c,
gnuc99.c,gnuc99-pedantic.c: New tests.
* gcc.dg/cpp/c++98.c,c++98-pedantic.c,c89.c,c89-pedantic.c,
c94.c,c94-pedantic.c,c99.c,c99-pedantic.c,gnuc89.c,gnuc89-pedantic.c,
gnuc99.c,gnuc99-pedantic.c: New tests.
2000-12-01 Joseph S. Myers <jsm28@cam.ac.uk>
@ -1569,9 +1576,9 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-12-01 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/20000720-1.S: Remove duplicate testcase.
* gcc.dg/cpp/poison.c: Update.
* gcc.dg/cpp/spacing1.c: New testcase for all spacing issues.
* gcc.dg/cpp/20000720-1.S: Remove duplicate testcase.
* gcc.dg/cpp/poison.c: Update.
* gcc.dg/cpp/spacing1.c: New testcase for all spacing issues.
2000-12-01 Toon Moene <toon@moene.indiv.nluug.nl>
@ -1727,7 +1734,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-22 Loren J. Rittle <ljrittle@acm.org>
* g++.old-deja/g++.robertl/eb39.C: Don't include libio.h.
* g++.old-deja/g++.robertl/eb39.C: Don't include libio.h.
2000-11-22 Jakub Jelinek <jakub@redhat.com>
@ -1747,7 +1754,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-21 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/integrated1.c: Remove.
* gcc.dg/cpp/integrated1.c: Remove.
2000-11-21 Jakub Jelinek <jakub@redhat.com>
@ -1773,8 +1780,8 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-20 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/paste2.c: Update test.
* objc/execute/paste.m: New test.
* gcc.dg/cpp/paste2.c: Update test.
* objc/execute/paste.m: New test.
2000-11-20 Joseph S. Myers <jsm28@cam.ac.uk>
@ -1853,8 +1860,8 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-15 Neil Booth <neilb@earthling.net>
gcc.dg/cpp/_Pragma1.c: Update.
gcc.dg/cpp/_Pragma2.c: New test.
gcc.dg/cpp/_Pragma1.c: Update.
gcc.dg/cpp/_Pragma2.c: New test.
2000-11-15 Nathan Sidwell <nathan@codesourcery.com>
@ -2038,7 +2045,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke <amylaar@redhat.com>
2000-11-04 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/include2.c: New tests.
* gcc.dg/cpp/include2.c: New tests.
Fri Nov 3 13:32:14 2000 Mark P Mitchell <mark@codesourcery.com>
@ -2092,7 +2099,7 @@ Fri Nov 3 13:32:14 2000 Mark P Mitchell <mark@codesourcery.com>
2000-10-29 Neil Booth <neilb@earthling.net>
* gcc.dg/cpp/macro4.c, macro5.c: New tests.
* gcc.dg/cpp/macro4.c, macro5.c: New tests.
* mi1.c, mi1c.h: Add null directives to multiple-include test.
* mi5.c: Test multiple includes work with -C.
* trigraphs.c: Test ^= version.
@ -2341,7 +2348,7 @@ Mon Oct 9 23:32:06 MET DST 2000 Jan Hubicka <jh@suse.cz>
2000-09-26 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/compile/20000923-1.c: New test.
* gcc.c-torture/compile/20000923-1.c: New test.
2000-09-25 Theodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
@ -2473,7 +2480,7 @@ Tue Sep 12 18:32:07 2000 J"orn Rennecke <amylaar@redhat.co.uk>
2000-09-07 Catherine Moore <clm@redhat.com>
* gcc.c-torture/execute/unroll-1.c: New test.
* gcc.c-torture/execute/unroll-1.c: New test.
2000-09-06 Zack Weinberg <zack@wolery.cumb.org>

View File

@ -1,3 +1,8 @@
/* This is just 920730-1.c compiled with -traditional.
See 920730-1t.x. */
/* It is necessary to undefine __GNUC__ in order to prevent glibc 2.2's
sys/cdefs.h from issuing an #error. Do Not Ask. */
#undef __GNUC__
#include "920730-1.c"

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2001 Free Software Foundation, Inc.
Contributed by Nathan Sidwell 8 May 2001 <nathan@codesourcery.com> */
/* Test of prohibition on directives which result from macro expansion.
See also direct2s.c */
/* { dg-do compile } */
#define HASH #
#define HASHDEFINE #define
#define HASHINCLUDE #include
HASH include "somerandomfile" /*{ dg-error "syntax|parse" "non-include" }*/
/*{ dg-bogus "No such" "don't execute non-include" { target *-*-* } 13 }*/
HASHINCLUDE <somerandomfile> /*{ dg-error "syntax|parse" "non-include 2" }*/
/*{ dg-bogus "No such" "don't execute non-include 2" { target *-*-* } 15 }*/
void g ()
{
HASH define X 1 /* { dg-error "syntax error" "# from macro" } */
HASHDEFINE Y 1 /* { dg-error "syntax error" "#define from macro" } */
}
#pragma GCC dependency "direct2.c"
#
void f ()
{
int i = X; /* { dg-error "undeclared|for each" "no macro X" } */
int j = Y; /* { dg-error "undeclared|for each" "no macro Y" } */
}
#define slashstar /##*
#define starslash *##/
slashstar starslash /* { dg-error "parse error" "not a comment" } */
/* { dg-warning "does not give" "paste warning(s)" { target *-*-* } 36 } */

View File

@ -0,0 +1,39 @@
/* Copyright (C) 2001 Free Software Foundation, Inc.
Contributed by Nathan Sidwell 8 May 2001 <nathan@codesourcery.com> */
/* Test of prohibition on directives which result from macro
expansion. Same as direct2.c, with -save-temps applied; results
should be identical. */
/* { dg-do compile } */
/* { dg-options "-save-temps -ansi -pedantic-errors" } */
#define HASH #
#define HASHDEFINE #define
#define HASHINCLUDE #include
HASH include "somerandomfile" /*{ dg-error "syntax|parse" "non-include" }*/
/*{ dg-bogus "No such" "don't execute non-include" { target *-*-* } 15 }*/
HASHINCLUDE <somerandomfile> /*{ dg-error "syntax|parse" "non-include 2" }*/
/*{ dg-bogus "No such" "don't execute non-include 2" { target *-*-* } 17 }*/
void g ()
{
HASH define X 1 /* { dg-error "syntax error" "# from macro" } */
HASHDEFINE Y 1 /* { dg-error "syntax error" "#define from macro" } */
}
#pragma GCC dependency "direct2s.c"
#
void f ()
{
int i = X; /* { dg-error "undeclared|for each" "no macro X" } */
int j = Y; /* { dg-error "undeclared|for each" "no macro Y" } */
}
#define slashstar /##*
#define starslash *##/
slashstar starslash /* { dg-error "parse error" "not a comment" } */
/* { dg-warning "does not give" "paste warning(s)" { target *-*-* } 38 } */

View File

@ -105,6 +105,7 @@ static const char *user_label_prefix;
It is zero for rescanning results of macro expansion
and for expanding macro arguments. */
#define INPUT_STACK_MAX 200
struct file_name_list;
struct file_buf {
const char *fname;
int lineno;
@ -120,6 +121,8 @@ struct file_buf {
struct if_stack *if_stack;
/* Object to be freed at end of input at this level. */
U_CHAR *free_ptr;
/* Position to start scanning for #include_next in this file. */
struct file_name_list *next_header_dir;
} instack[INPUT_STACK_MAX];
typedef struct file_buf FILE_BUF;
@ -240,6 +243,7 @@ union hashval {
enum node_type {
T_DEFINE = 1, /* `#define' */
T_INCLUDE, /* `#include' */
T_INCLUDE_NEXT,/* `#include_next' */
T_IFDEF, /* `#ifdef' */
T_IFNDEF, /* `#ifndef' */
T_IF, /* `#if' */
@ -358,6 +362,7 @@ static void do_error PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
static void do_warning PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
static void do_line PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
static void do_include PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
static void do_include_next PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
static void do_undef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
static void do_if PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
static void do_ifdef PARAMS ((U_CHAR *, U_CHAR *, FILE_BUF *));
@ -415,7 +420,10 @@ static void make_assertion PARAMS ((const char *));
static void grow_outbuf PARAMS ((FILE_BUF *, int));
static int handle_directive PARAMS ((FILE_BUF *, FILE_BUF *));
static void finclude PARAMS ((int, const char *, FILE_BUF *));
static void process_include PARAMS ((struct file_name_list *,
const U_CHAR *, int, int, FILE_BUF *));
static void finclude PARAMS ((int, const char *,
struct file_name_list *, FILE_BUF *));
static void init_dependency_output PARAMS ((void));
static void rescan PARAMS ((FILE_BUF *, int));
static void newline_fix PARAMS ((U_CHAR *));
@ -450,6 +458,7 @@ struct directive directive_table[] = {
{ 4, do_elif, "elif", T_ELIF },
{ 5, do_error, "error", T_ERROR },
{ 7, do_warning, "warning", T_WARNING },
{ 12, do_include_next, "include_next", T_INCLUDE_NEXT },
{ 6, do_assert, "assert", T_ASSERT },
{ 8, do_unassert,"unassert",T_UNASSERT},
{ -1, 0, "", T_UNUSED},
@ -853,7 +862,7 @@ main (argc, argv)
if (print_deps)
deps_add_dep (deps, pend[i].arg);
finclude (fd, pend[i].arg, &outbuf);
finclude (fd, pend[i].arg, 0, &outbuf);
}
indepth--;
no_output--;
@ -2278,22 +2287,17 @@ do_include (buf, limit, op)
U_CHAR *buf, *limit;
FILE_BUF *op;
{
char *fname; /* Dynamically allocated fname buffer */
U_CHAR *fbeg, *fend; /* Beginning and end of fname */
struct file_name_list *stackp = include; /* Chain of dirs to search */
struct file_name_list dsp[1]; /* First in chain, if #include "..." */
int flen;
int f; /* file number */
int retried = 0; /* Have already tried macro
expanding the include line*/
FILE_BUF trybuf; /* It got expanded into here */
int system_header_p = 0; /* 0 for "...", 1 for <...> */
f= -1; /* JF we iz paranoid! */
get_filename:
fbeg = buf;
@ -2374,6 +2378,90 @@ get_filename:
}
flen = fend - fbeg;
process_include (stackp, fbeg, flen, system_header_p, op);
}
static void
do_include_next (buf, limit, op)
U_CHAR *buf, *limit;
FILE_BUF *op;
{
U_CHAR *fbeg, *fend; /* Beginning and end of fname */
struct file_name_list *stackp; /* Chain of dirs to search */
int flen;
int retried = 0; /* Have already tried macro
expanding the include line*/
FILE_BUF trybuf; /* It got expanded into here */
int system_header_p = 0; /* 0 for "...", 1 for <...> */
/* Treat as plain #include if we don't know where to start
looking. */
stackp = instack[indepth].next_header_dir;
if (stackp == 0)
{
do_include (buf, limit, op);
return;
}
get_filename:
fbeg = buf;
SKIP_WHITE_SPACE (fbeg);
/* Discard trailing whitespace so we can easily see
if we have parsed all the significant chars we were given. */
while (limit != fbeg && is_nvspace (limit[-1])) limit--;
switch (*fbeg++) {
case '\"':
fend = fbeg;
while (fend != limit && *fend != '\"')
fend++;
if (*fend == '\"' && fend + 1 == limit)
break;
goto fail;
case '<':
fend = fbeg;
while (fend != limit && *fend != '>') fend++;
if (*fend == '>' && fend + 1 == limit) {
system_header_p = 1;
break;
}
goto fail;
default:
fail:
if (retried) {
error ("#include expects \"fname\" or <fname>");
return;
} else {
trybuf = expand_to_temp_buffer (buf, limit, 0);
buf = (U_CHAR *) alloca (trybuf.bufp - trybuf.buf + 1);
memcpy (buf, trybuf.buf, trybuf.bufp - trybuf.buf);
limit = buf + (trybuf.bufp - trybuf.buf);
free (trybuf.buf);
retried++;
goto get_filename;
}
}
flen = fend - fbeg;
process_include (stackp, fbeg, flen, system_header_p, op);
}
static void
process_include (stackp, fbeg, flen, system_header_p, op)
struct file_name_list *stackp;
const U_CHAR *fbeg;
int flen;
int system_header_p;
FILE_BUF *op;
{
char *fname;
int f = -1; /* file number */
fname = (char *) alloca (max_include_len + flen + 2);
/* + 2 above for slash and terminating null. */
@ -2472,7 +2560,7 @@ get_filename:
system_include_depth++;
/* Actually process the file. */
finclude (f, fname, op);
finclude (f, fname, stackp->next, op);
if (system_header_p)
system_include_depth--;
@ -2485,9 +2573,10 @@ get_filename:
with output to OP. */
static void
finclude (f, fname, op)
finclude (f, fname, nhd, op)
int f;
const char *fname;
struct file_name_list *nhd;
FILE_BUF *op;
{
int st_mode;
@ -2506,6 +2595,7 @@ finclude (f, fname, op)
fp->length = 0;
fp->lineno = 1;
fp->if_stack = if_stack;
fp->next_header_dir = nhd;
if (S_ISREG (st_mode)) {
fp->buf = (U_CHAR *) xmalloc (st_size + 2);