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
This commit is contained in:
parent
b25c17bcf0
commit
a09d474429
9 changed files with 57 additions and 20 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
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
|
||||||
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 @@
|
||||||
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
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
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 @@
|
||||||
|
|
||||||
#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
|
||||||
|
|
6
gcc/testsuite/gcc.dg/cpp/trad/comment-3.c
Normal file
6
gcc/testsuite/gcc.dg/cpp/trad/comment-3.c
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/* Test we don't accept C++ comments. */
|
||||||
|
|
||||||
|
/* { dg-do preprocess } */
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#endif // /* { dg-warning "extra tokens" } */
|
|
@ -1,3 +1,12 @@
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue