Commit a09d4744 by Neil Booth Committed by Neil Booth

re PR preprocessor/16192 (Bug in expression evaluation when operand is missing)

	* doc/cpp.texi: Don't document what we do for ill-formed expressions.
	* doc/cppopts.texi: Clarify processing of command-line defines.

libcpp:
	PR preprocessor/16192
	PR preprocessor/15913
	PR preprocessor/15572
	* expr.c (_cpp_parse_expr): Handle remaining cases where an
	expression is missing.
	* init.c (post_options): Traditional cpp doesn't do // comments.

testsuite:
	* gcc.dg/cpp/if-mop.c: Two new testcases.
	* gcc.dg/cpp/trad/comment-3.c: New.

From-SVN: r84080
parent b25c17bc
2004-07-04 Neil Booth <neil@duron.akihabara.co.uk>
* doc/cpp.texi: Don't document what we do for ill-formed expressions.
* doc/cppopts.texi: Clarify processing of command-line defines.
2004-07-04 Gerald Pfeifer <gerald@pfeifer.com> 2004-07-04 Gerald Pfeifer <gerald@pfeifer.com>
* doc/contrib.texi (Contributors): Adjust link for GNU Classpath. * doc/contrib.texi (Contributors): Adjust link for GNU Classpath.
......
...@@ -2965,9 +2965,6 @@ expression, and may give different results in some cases. If the value ...@@ -2965,9 +2965,6 @@ expression, and may give different results in some cases. If the value
comes out to be nonzero, the @samp{#if} succeeds and the @var{controlled comes out to be nonzero, the @samp{#if} succeeds and the @var{controlled
text} is included; otherwise it is skipped. text} is included; otherwise it is skipped.
If @var{expression} is not correctly formed, GCC issues an error and
treats the conditional as having failed.
@node Defined @node Defined
@subsection Defined @subsection Defined
......
...@@ -16,11 +16,14 @@ ...@@ -16,11 +16,14 @@
Predefine @var{name} as a macro, with definition @code{1}. Predefine @var{name} as a macro, with definition @code{1}.
@item -D @var{name}=@var{definition} @item -D @var{name}=@var{definition}
Predefine @var{name} as a macro, with definition @var{definition}. The contents of @var{definition} are tokenized and processed as if
There are no restrictions on the contents of @var{definition}, but if they appeared during translation phase three in a @samp{#define}
you are invoking the preprocessor from a shell or shell-like program you directive. In particular, the definition will be truncated by
may need to use the shell's quoting syntax to protect characters such as embedded newline characters.
spaces that have a meaning in the shell syntax.
If you are invoking the preprocessor from a shell or shell-like
program you may need to use the shell's quoting syntax to protect
characters such as spaces that have a meaning in the shell syntax.
If you wish to define a function-like macro on the command line, write If you wish to define a function-like macro on the command line, write
its argument list with surrounding parentheses before the equals sign its argument list with surrounding parentheses before the equals sign
......
2004-07-04 Neil Booth <neil@duron.akihabara.co.uk>
* gcc.dg/cpp/if-mop.c: Two new testcases.
* gcc.dg/cpp/trad/comment-3.c: New.
2004-07-04 Paul Brook <paul@codesourcery.com> 2004-07-04 Paul Brook <paul@codesourcery.com>
* gfortran.fortran-torture/compile/implicit_1.f90: New test. * gfortran.fortran-torture/compile/implicit_1.f90: New test.
......
...@@ -23,3 +23,9 @@ ...@@ -23,3 +23,9 @@
#if (2) 4 * 2 /* { dg-error "missing bin" "close paren then immediate" } */ #if (2) 4 * 2 /* { dg-error "missing bin" "close paren then immediate" } */
#endif #endif
#if == 2 /* { dg-error "no left op" } */
#endif
#if (==2) /* { dg-error "no left op" } */
#endif
/* Test we don't accept C++ comments. */
/* { dg-do preprocess } */
#if 0
#endif // /* { dg-warning "extra tokens" } */
2004-07-04 Neil Booth <neil@duron.akihabara.co.uk>
PR preprocessor/16192
PR preprocessor/15913
PR preprocessor/15572
* expr.c (_cpp_parse_expr): Handle remaining cases where an
expression is missing.
* init.c (post_options): Traditional cpp doesn't do // comments.
2004-06-30 Per Bothner <per@bothner.com> 2004-06-30 Per Bothner <per@bothner.com>
* include/line-map.h (fileline): Remove old typedef. * include/line-map.h (fileline): Remove old typedef.
......
...@@ -747,18 +747,22 @@ _cpp_parse_expr (cpp_reader *pfile) ...@@ -747,18 +747,22 @@ _cpp_parse_expr (cpp_reader *pfile)
} }
else if (want_value) else if (want_value)
{ {
/* Ordering here is subtle and intended to favor the /* We want a number (or expression) and haven't got one.
missing parenthesis diagnostics over alternatives. */ Try to emit a specific diagnostic. */
if (op.op == CPP_CLOSE_PAREN) if (op.op == CPP_CLOSE_PAREN && top->op == CPP_OPEN_PAREN)
{ SYNTAX_ERROR ("missing expression between '(' and ')'");
if (top->op == CPP_OPEN_PAREN)
SYNTAX_ERROR ("void expression between '(' and ')'"); if (op.op == CPP_EOF && top->op == CPP_EOF)
} SYNTAX_ERROR ("#if with no expression");
else if (top->op == CPP_EOF)
SYNTAX_ERROR ("#if with no expression"); if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN)
if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN) SYNTAX_ERROR2 ("operator '%s' has no right operand",
SYNTAX_ERROR2 ("operator '%s' has no right operand", cpp_token_as_text (pfile, top->token));
cpp_token_as_text (pfile, top->token)); else if (op.op == CPP_CLOSE_PAREN || op.op == CPP_EOF)
/* Complain about missing paren during reduction. */;
else
SYNTAX_ERROR2 ("operator '%s' has no left operand",
cpp_token_as_text (pfile, op.token));
} }
top = reduce (pfile, top, op.op); top = reduce (pfile, top, op.op);
......
...@@ -611,6 +611,8 @@ post_options (cpp_reader *pfile) ...@@ -611,6 +611,8 @@ post_options (cpp_reader *pfile)
if (CPP_OPTION (pfile, traditional)) if (CPP_OPTION (pfile, traditional))
{ {
CPP_OPTION (pfile, cplusplus_comments) = 0;
/* Traditional CPP does not accurately track column information. */ /* Traditional CPP does not accurately track column information. */
CPP_OPTION (pfile, show_column) = 0; CPP_OPTION (pfile, show_column) = 0;
CPP_OPTION (pfile, trigraphs) = 0; CPP_OPTION (pfile, trigraphs) = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment