aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Christopher <echristo@redhat.com>2005-02-15 23:18:04 +0000
committerEric Christopher <echristo@gcc.gnu.org>2005-02-15 23:18:04 +0000
commit6da55c00778900ffd44630fa110ea83207a1a516 (patch)
tree88d1edaa90379d91bcd7b9bad1e228c48a4e8210
parent6f85d0c4797a5f39c061288e059c6c24cb9290f9 (diff)
downloadgcc-6da55c00778900ffd44630fa110ea83207a1a516.zip
gcc-6da55c00778900ffd44630fa110ea83207a1a516.tar.gz
gcc-6da55c00778900ffd44630fa110ea83207a1a516.tar.bz2
re PR preprocessor/19077 (Internal compiler error compiling MPlayer)
2005-02-15 Eric Christopher <echristo@redhat.com> PR preprocessor/19077 * macro.c (cpp_macro_definition): Move handling of whitespace to PREV_WHITE conditional. Remove overloading of len variable. 2005-02-15 Eric Christopher <echristo@redhat.com> * gcc.dg/cpp/20050215-1.c: New file. From-SVN: r95080
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/cpp/20050215-1.c10
-rw-r--r--libcpp/ChangeLog7
-rw-r--r--libcpp/macro.c12
4 files changed, 29 insertions, 4 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fc56108..34b9f12 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-02-15 Eric Christopher <echristo@redhat.com>
+
+ * gcc.dg/cpp/20050215-1.c: New file.
+
2005-02-15 James A. Morrison <phython@gcc.gnu.org>
PR tree-optimization/15785
diff --git a/gcc/testsuite/gcc.dg/cpp/20050215-1.c b/gcc/testsuite/gcc.dg/cpp/20050215-1.c
new file mode 100644
index 0000000..e5aaf22
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/20050215-1.c
@@ -0,0 +1,10 @@
+/* Testcase for memory corruption bug in macro processing.
+ See PR preprocessor/19077 for details. */
+
+/* { dg-do compile } */
+/* { dg-options "-g3" } */
+#define FOO(a,b,c,d,e) a b c d e \
+" " \
+" " \
+" "
+int i;
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 26e6504..5c58eb7 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,10 @@
+2005-02-15 Eric Christopher <echristo@redhat.com>
+
+ PR preprocessor/19077
+ * macro.c (cpp_macro_definition): Move handling of whitespace
+ to PREV_WHITE conditional. Remove overloading of len
+ variable.
+
2005-02-14 Kazu Hirata <kazu@cs.umass.edu>
* directives.c, files.c, init.c, internal.h, macro.c, pch.c,
diff --git a/libcpp/macro.c b/libcpp/macro.c
index 7ad1396..5e59669 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -1666,6 +1666,7 @@ cpp_macro_definition (cpp_reader *pfile, const cpp_hashnode *node)
len += NODE_LEN (macro->params[i]) + 1; /* "," */
}
+ /* This should match below where we fill in the buffer. */
if (CPP_OPTION (pfile, traditional))
len += _cpp_replacement_text_len (macro);
else
@@ -1677,11 +1678,14 @@ cpp_macro_definition (cpp_reader *pfile, const cpp_hashnode *node)
if (token->type == CPP_MACRO_ARG)
len += NODE_LEN (macro->params[token->val.arg_no - 1]);
else
- len += cpp_token_len (token) + 1; /* Includes room for ' '. */
+ len += cpp_token_len (token);
+
if (token->flags & STRINGIFY_ARG)
len++; /* "#" */
if (token->flags & PASTE_LEFT)
len += 3; /* " ##" */
+ if (token->flags & PREV_WHITE)
+ len++; /* " " */
}
}
@@ -1741,10 +1745,10 @@ cpp_macro_definition (cpp_reader *pfile, const cpp_hashnode *node)
if (token->type == CPP_MACRO_ARG)
{
- len = NODE_LEN (macro->params[token->val.arg_no - 1]);
memcpy (buffer,
- NODE_NAME (macro->params[token->val.arg_no - 1]), len);
- buffer += len;
+ NODE_NAME (macro->params[token->val.arg_no - 1]),
+ NODE_LEN (macro->params[token->val.arg_no - 1]));
+ buffer += NODE_LEN (macro->params[token->val.arg_no - 1]);
}
else
buffer = cpp_spell_token (pfile, token, buffer);