From: zack Date: Thu, 10 May 2001 00:07:23 +0000 (+0000) Subject: * cppinit.c (cpp_post_options): Shut off macro expansion if X-Git-Tag: upstream/4.9.2~94527 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=946ce1b70473e06c40af6817c28521213af2fb8d;p=platform%2Fupstream%2Flinaro-gcc.git * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41932 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa02fad..a081dfe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,24 @@ +2001-05-09 Zack Weinberg + + * 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 * objc.texi: Move from ../libobjc/objc-features.texi. Adjust for @@ -466,7 +487,7 @@ Fri May 4 13:10:03 CEST 2001 Jan Hubicka (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. diff --git a/gcc/cppinit.c b/gcc/cppinit.c index 980cdb1..fc15db4 100644 --- a/gcc/cppinit.c +++ b/gcc/cppinit.c @@ -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. */ diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 057bdf4c..97e0cf2 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -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 diff --git a/gcc/cppmain.c b/gcc/cppmain.c index ceab9c9..db7f073 100644 --- a/gcc/cppmain.c +++ b/gcc/cppmain.c @@ -238,6 +238,13 @@ scan_buffer (pfile) == AVOID_LPASTE && cpp_avoid_paste (pfile, &tokens[1 - index], token)) token->flags |= PREV_WHITE; + /* Special case '# ': 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; diff --git a/gcc/gsyslimits.h b/gcc/gsyslimits.h index cc7b3fb..a362802 100644 --- a/gcc/gsyslimits.h +++ b/gcc/gsyslimits.h @@ -4,5 +4,5 @@ instead of this text. */ #define _GCC_NEXT_LIMITS_H /* tell gcc's limits.h to recurse */ - #include_next +#include_next #undef _GCC_NEXT_LIMITS_H diff --git a/gcc/limity.h b/gcc/limity.h index b2831fc..8bb398f 100644 --- a/gcc/limity.h +++ b/gcc/limity.h @@ -4,7 +4,7 @@ #else /* not _GCC_LIMITS_H_ */ #ifdef _GCC_NEXT_LIMITS_H - #include_next /* recurse down to the real one */ +#include_next /* recurse down to the real one */ #endif #endif /* not _GCC_LIMITS_H_ */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f4a0c70..a540321 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2001-05-09 Zack Weinberg + + * 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 * 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 @@ -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 - + * 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 - * g++.old-deja/g++.robertl/eb42.C: Same. + * g++.old-deja/g++.robertl/eb42.C: Same. 001-04-10 Kaveh R. Ghazi @@ -470,9 +477,9 @@ Fri Apr 6 15:36:15 2001 J"orn Rennecke 2001-03-06 Zack Weinberg - * 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 2001-02-21 Gabriel Dos Reis - * g++.old-deja/g++.other/lookup22.C: New test. - + * g++.old-deja/g++.other/lookup22.C: New test. + 2001-02-19 Zack Weinberg * g77.dg: New directory. @@ -562,7 +569,7 @@ Wed Feb 21 12:38:22 2001 Ovidiu Predescu 2001-02-16 Gabriel Dos Reis * g++.old-deja/g++.other/decl9.C: New test. - + 2001-02-16 Jakub Jelinek * 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 2001-02-06 Neil Booth - * gcc.dg/cpp/avoidpaste1.c: Update. + * gcc.dg/cpp/avoidpaste1.c: Update. Tue Feb 5 8:53:33 2001 Ovidiu Predescu @@ -718,7 +725,7 @@ Tue Feb 5 8:53:33 2001 Ovidiu Predescu 2001-02-01 Neil Booth - * gcc.dg/cpp/avoidpaste2.c: New tests. + * gcc.dg/cpp/avoidpaste2.c: New tests. 2001-01-31 Jakub Jelinek @@ -739,12 +746,12 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke 2001-01-31 Neil Booth - * gcc.dg/cpp/tr-warn1.c: Add tests. + * gcc.dg/cpp/tr-warn1.c: Add tests. 2001-01-31 Neil Booth - * 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 @@ -770,7 +777,7 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke 2001-01-28 Neil Booth - * gcc.dg/cpp/avoidpaste1.c: Test case. + * gcc.dg/cpp/avoidpaste1.c: Test case. 2001-01-28 Jakub Jelinek @@ -886,7 +893,7 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke 2001-01-18 Neil Booth - * gcc.dg/cpp/assembl2.S: New test case. + * gcc.dg/cpp/assembl2.S: New test case. 2001-01-17 Jeffrey Oldham @@ -926,9 +933,9 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke 2001-01-15 Neil Booth - * 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 * g++.old-deja/g++.ext/instantiate2.C: Add explanatory comment. @@ -970,8 +977,8 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke 2001-01-13 Neil Booth - * 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 @@ -1018,7 +1025,7 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke 2001-01-10 Alan Lehotsky * gcc.dg/20000926-1.c: Parameterize for machines with 16-bit ints. - + 2001-01-10 Nathan Sidwell * g++.old-deja/g++.pt/error3.C: New test. @@ -1034,17 +1041,17 @@ Wed Jan 31 12:23:32 2001 J"orn Rennecke 2001-01-08 Jonathan Larmour * 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 * 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 to - parameterize. - + parameterize. + 2001-01-09 Jeffrey Oldham * 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 2001-01-03 Jeffrey Oldham * 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 @@ -1362,12 +1369,12 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-17 Neil Booth - * gcc.dg/cpp/multiline.c: New test. + * gcc.dg/cpp/multiline.c: New test. 2000-12-17 Neil Booth - * 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 @@ -1415,7 +1422,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-11 Neil Booth - * 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 @@ -1423,10 +1430,10 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-09 Neil Booth - * 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 @@ -1434,12 +1441,12 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-07 Neil Booth - * 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 @@ -1514,8 +1521,8 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-04 Neil Booth - * 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 @@ -1528,7 +1535,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-03 Neil Booth - * gcc.dg/cpp/macro6.c: New test cases. + * gcc.dg/cpp/macro6.c: New test cases. 2000-12-02 Kaveh R. Ghazi @@ -1548,19 +1555,19 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-02 Neil Booth - * 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 - * 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 - * 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 @@ -1569,9 +1576,9 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-12-01 Neil Booth - * 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 @@ -1727,7 +1734,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-11-22 Loren J. Rittle - * 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 @@ -1747,7 +1754,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-11-21 Neil Booth - * gcc.dg/cpp/integrated1.c: Remove. + * gcc.dg/cpp/integrated1.c: Remove. 2000-11-21 Jakub Jelinek @@ -1773,8 +1780,8 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-11-20 Neil Booth - * 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 @@ -1853,8 +1860,8 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-11-15 Neil Booth - 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 @@ -2038,7 +2045,7 @@ Thu Dec 21 22:43:03 2000 J"orn Rennecke 2000-11-04 Neil Booth - * gcc.dg/cpp/include2.c: New tests. + * gcc.dg/cpp/include2.c: New tests. Fri Nov 3 13:32:14 2000 Mark P Mitchell @@ -2092,7 +2099,7 @@ Fri Nov 3 13:32:14 2000 Mark P Mitchell 2000-10-29 Neil Booth - * 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 2000-09-26 Jakub Jelinek - * gcc.c-torture/compile/20000923-1.c: New test. + * gcc.c-torture/compile/20000923-1.c: New test. 2000-09-25 Theodore Papadopoulo @@ -2473,7 +2480,7 @@ Tue Sep 12 18:32:07 2000 J"orn Rennecke 2000-09-07 Catherine Moore - * gcc.c-torture/execute/unroll-1.c: New test. + * gcc.c-torture/execute/unroll-1.c: New test. 2000-09-06 Zack Weinberg diff --git a/gcc/testsuite/gcc.c-torture/execute/920730-1t.c b/gcc/testsuite/gcc.c-torture/execute/920730-1t.c index bc5e413..7467f35 100644 --- a/gcc/testsuite/gcc.c-torture/execute/920730-1t.c +++ b/gcc/testsuite/gcc.c-torture/execute/920730-1t.c @@ -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" diff --git a/gcc/testsuite/gcc.dg/cpp/direct2.c b/gcc/testsuite/gcc.dg/cpp/direct2.c new file mode 100644 index 0000000..d6dc108 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/direct2.c @@ -0,0 +1,37 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + Contributed by Nathan Sidwell 8 May 2001 */ + +/* 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 /*{ 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 } */ diff --git a/gcc/testsuite/gcc.dg/cpp/direct2s.c b/gcc/testsuite/gcc.dg/cpp/direct2s.c new file mode 100644 index 0000000..6c98ecc --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/direct2s.c @@ -0,0 +1,39 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + Contributed by Nathan Sidwell 8 May 2001 */ + +/* 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 /*{ 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 } */ diff --git a/gcc/tradcpp.c b/gcc/tradcpp.c index bfb1202..46b7e99 100644 --- a/gcc/tradcpp.c +++ b/gcc/tradcpp.c @@ -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 "); + 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);