aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZack Weinberg <zack@wolery.cumb.org>2000-04-07 21:09:51 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-04-07 21:09:51 +0000
commitf787c583ae1966a61ae9e1e8b5645ec5834de1ac (patch)
tree1cdc2119b4eff8f84b844f88f3a85efa4575cb1e /gcc
parentfbc18d1984e7b4c919f7e5a3aa05e0287270785a (diff)
downloadgcc-f787c583ae1966a61ae9e1e8b5645ec5834de1ac.zip
gcc-f787c583ae1966a61ae9e1e8b5645ec5834de1ac.tar.gz
gcc-f787c583ae1966a61ae9e1e8b5645ec5834de1ac.tar.bz2
cpplib.c (do_elif): Skip the rest of the line if we're not going to bother evaluating it.
* cpplib.c (do_elif): Skip the rest of the line if we're not going to bother evaluating it. (skip_if_group): Clear pfile->only_seen_white. Reorder loop to avoid pointless calls to the lexer. * gcc.dg/cpp-mi2.c: New test. * gcc.dg/cpp-mi2[abc].h: New files. From-SVN: r33008
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cpplib.c28
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/cpp-mi2.c12
-rw-r--r--gcc/testsuite/gcc.dg/cpp-mi2a.h5
-rw-r--r--gcc/testsuite/gcc.dg/cpp-mi2b.h6
-rw-r--r--gcc/testsuite/gcc.dg/cpp-mi2c.h15
7 files changed, 67 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c6e5b97..be0f998 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2000-04-07 Zack Weinberg <zack@wolery.cumb.org>
+
+ * cpplib.c (do_elif): Skip the rest of the line if we're
+ not going to bother evaluating it.
+ (skip_if_group): Clear pfile->only_seen_white. Reorder loop
+ to avoid pointless calls to the lexer.
+
Fri Apr 7 11:50:54 2000 Jim Wilson <wilson@cygnus.com>
* config/ia64/ia64.c: Delete stdio.h and ctype.h includes.
diff --git a/gcc/cpplib.c b/gcc/cpplib.c
index 52e83ba..babd20e 100644
--- a/gcc/cpplib.c
+++ b/gcc/cpplib.c
@@ -1266,7 +1266,10 @@ do_elif (pfile)
}
if (pfile->if_stack->if_succeeded)
- return skip_if_group (pfile);
+ {
+ _cpp_skip_rest_of_line (pfile);
+ return skip_if_group (pfile);
+ }
if (_cpp_parse_expr (pfile) == 0)
return skip_if_group (pfile);
@@ -1498,11 +1501,24 @@ skip_if_group (pfile)
long old_written;
int ret = 0;
+ /* We are no longer at the start of the file. */
+ pfile->only_seen_white = 0;
+
old_written = CPP_WRITTEN (pfile);
pfile->no_macro_expand++;
CPP_OPTION (pfile, no_line_commands)++;
for (;;)
{
+ /* We are at the end of a line. Only cpp_get_token knows how to
+ advance the line number correctly. */
+ token = cpp_get_token (pfile);
+ if (token == CPP_POP)
+ break; /* Caller will issue error. */
+
+ else if (token != CPP_VSPACE)
+ cpp_ice (pfile, "cpp_get_token returned %d in skip_if_group", token);
+ CPP_SET_WRITTEN (pfile, old_written);
+
token = _cpp_get_directive_token (pfile);
if (token == CPP_DIRECTIVE)
@@ -1514,16 +1530,6 @@ skip_if_group (pfile)
if (token != CPP_VSPACE)
_cpp_skip_rest_of_line (pfile);
-
- /* Only cpp_get_token knows how to advance the line number
- properly. */
- token = cpp_get_token (pfile);
- if (token == CPP_POP)
- break; /* Caller will issue error. */
-
- else if (token != CPP_VSPACE)
- cpp_ice (pfile, "cpp_get_token returned %d in skip_if_group", token);
- CPP_SET_WRITTEN (pfile, old_written);
}
CPP_SET_WRITTEN (pfile, old_written);
pfile->no_macro_expand--;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d5f6bbd..afce1fb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2000-04-07 Zack Weinberg <zack@wolery.cumb.org>
+
+ * gcc.dg/cpp-mi2.c: New test.
+ * gcc.dg/cpp-mi2[abc].h: New files.
+
2000-04-07 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.abi/vmihint.C: Adjust __vmi_class_type_info
diff --git a/gcc/testsuite/gcc.dg/cpp-mi2.c b/gcc/testsuite/gcc.dg/cpp-mi2.c
new file mode 100644
index 0000000..d5c814c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp-mi2.c
@@ -0,0 +1,12 @@
+/* Test for overly eager multiple include optimization.
+ Problem distilled from glibc 2.0.7's time.h, sys/time.h, timebits.h.
+ Problem noted by Tom Tromey <tromey@cygnus.com>. */
+/* { dg-do compile } */
+
+#include "cpp-mi2a.h"
+#include "cpp-mi2b.h"
+
+int main (void)
+{
+ return x;
+}
diff --git a/gcc/testsuite/gcc.dg/cpp-mi2a.h b/gcc/testsuite/gcc.dg/cpp-mi2a.h
new file mode 100644
index 0000000..c86838c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp-mi2a.h
@@ -0,0 +1,5 @@
+/* Test for overly eager multiple include optimization.
+ Problem distilled from glibc 2.0.7's time.h, sys/time.h, timebits.h.
+ Problem noted by Tom Tromey <tromey@cygnus.com>. */
+
+#include "cpp-mi2c.h"
diff --git a/gcc/testsuite/gcc.dg/cpp-mi2b.h b/gcc/testsuite/gcc.dg/cpp-mi2b.h
new file mode 100644
index 0000000..8d1970c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp-mi2b.h
@@ -0,0 +1,6 @@
+/* Test for overly eager multiple include optimization.
+ Problem distilled from glibc 2.0.7's time.h, sys/time.h, timebits.h.
+ Problem noted by Tom Tromey <tromey@cygnus.com>. */
+
+#define need_x
+#include "cpp-mi2c.h"
diff --git a/gcc/testsuite/gcc.dg/cpp-mi2c.h b/gcc/testsuite/gcc.dg/cpp-mi2c.h
new file mode 100644
index 0000000..521792b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp-mi2c.h
@@ -0,0 +1,15 @@
+/* Test for overly eager multiple include optimization.
+ Problem distilled from glibc 2.0.7's time.h, sys/time.h, timebits.h.
+ Problem noted by Tom Tromey <tromey@cygnus.com>. */
+#ifdef need_x
+#undef need_x
+#ifndef have_x
+#define have_x
+extern int x;
+#endif
+#endif
+
+#ifndef t_h
+#define t_h
+extern int y;
+#endif