Commit 0a7ed33c by Bernd Schmidt Committed by Jeff Law

c-common.c (c_expand_start_cond, [...]): Don't warn about non-ambiguous else…

c-common.c (c_expand_start_cond, [...]): Don't warn about non-ambiguous else even if braces are missing.

        * c-common.c (c_expand_start_cond, c_expand_end_cond,
        c_expand_start_else): Don't warn about non-ambiguous else even if
        braces are missing.

From-SVN: r18055
parent 68c9728a
Tue Feb 17 23:30:20 1998 Bernd Schmidt <crux@ohara.Informatik.RWTH-Aachen.DE>
* c-common.c (c_expand_start_cond, c_expand_end_cond,
c_expand_start_else): Don't warn about non-ambiguous else even if
braces are missing.
Tue Feb 17 23:56:50 1998 Robert Lipe <robertl@dgii.com> Tue Feb 17 23:56:50 1998 Robert Lipe <robertl@dgii.com>
* sco5.h (ASM_OUTPUT_DOUBLE, ASM_OUTPUT_FLOAT, * sco5.h (ASM_OUTPUT_DOUBLE, ASM_OUTPUT_FLOAT,
ASM_OUTPUT_LONG_DOUBLE): Delete. Use the ones from i386.h ASM_OUTPUT_LONG_DOUBLE): Delete. Use the ones from i386.h
instead. instead.
......
...@@ -64,9 +64,20 @@ static void add_attribute PROTO((enum attrs, char *, ...@@ -64,9 +64,20 @@ static void add_attribute PROTO((enum attrs, char *,
static void init_attributes PROTO((void)); static void init_attributes PROTO((void));
static void record_international_format PROTO((tree, tree, int)); static void record_international_format PROTO((tree, tree, int));
/* Keep a stack of if statements. The value recorded is the number of /* Keep a stack of if statements. We record the number of compound
compound statements seen up to the if keyword. */ statements seen up to the if keyword, as well as the line number
static int *if_stack; and file of the if. If a potentially ambiguous else is seen, that
fact is recorded; the warning is issued when we can be sure that
the enclosing if statement does not have an else branch. */
typedef struct
{
int compstmt_count;
int line;
char *file;
int needs_warning;
} if_elt;
static if_elt *if_stack;
/* Amount of space in the if statement stack. */ /* Amount of space in the if statement stack. */
static int if_stack_space = 0; static int if_stack_space = 0;
...@@ -74,6 +85,9 @@ static int if_stack_space = 0; ...@@ -74,6 +85,9 @@ static int if_stack_space = 0;
/* Stack pointer. */ /* Stack pointer. */
static int if_stack_pointer = 0; static int if_stack_pointer = 0;
/* Generate RTL for the start of an if-then, and record the start of it
for ambiguous else detection. */
void void
c_expand_start_cond (cond, exitflag, compstmt_count) c_expand_start_cond (cond, exitflag, compstmt_count)
tree cond; tree cond;
...@@ -84,37 +98,57 @@ c_expand_start_cond (cond, exitflag, compstmt_count) ...@@ -84,37 +98,57 @@ c_expand_start_cond (cond, exitflag, compstmt_count)
if (if_stack_space == 0) if (if_stack_space == 0)
{ {
if_stack_space = 10; if_stack_space = 10;
if_stack = (int *)xmalloc (10 * sizeof (int)); if_stack = (if_elt *)xmalloc (10 * sizeof (if_elt));
} }
else if (if_stack_space == if_stack_pointer) else if (if_stack_space == if_stack_pointer)
{ {
if_stack_space += 10; if_stack_space += 10;
if_stack = (int *)xrealloc (if_stack, if_stack_space * sizeof (int)); if_stack = (if_elt *)xrealloc (if_stack, if_stack_space * sizeof (if_elt));
} }
/* Record this if statement. */ /* Record this if statement. */
if_stack[if_stack_pointer++] = compstmt_count; if_stack[if_stack_pointer].compstmt_count = compstmt_count;
if_stack[if_stack_pointer].file = input_filename;
if_stack[if_stack_pointer].line = lineno;
if_stack[if_stack_pointer].needs_warning = 0;
if_stack_pointer++;
expand_start_cond (cond, exitflag); expand_start_cond (cond, exitflag);
} }
/* Generate RTL for the end of an if-then. Optionally warn if a nested
if statement had an ambiguous else clause. */
void void
c_expand_end_cond () c_expand_end_cond ()
{ {
if_stack_pointer--; if_stack_pointer--;
if (if_stack[if_stack_pointer].needs_warning)
warning_with_file_and_line (if_stack[if_stack_pointer].file,
if_stack[if_stack_pointer].line,
"suggest explicit braces to avoid ambiguous `else'");
expand_end_cond (); expand_end_cond ();
} }
/* Generate RTL between the then-clause and the else-clause
of an if-then-else. */
void void
c_expand_start_else () c_expand_start_else ()
{ {
/* An ambiguous else warning must be generated for the enclosing if
statement, unless we see an else branch for that one, too. */
if (warn_parentheses if (warn_parentheses
&& if_stack_pointer > 1 && if_stack_pointer > 1
&& if_stack[if_stack_pointer - 1] == if_stack[if_stack_pointer - 2]) && (if_stack[if_stack_pointer - 1].compstmt_count
warning ("suggest explicit braces to avoid ambiguous `else'"); == if_stack[if_stack_pointer - 2].compstmt_count))
if_stack[if_stack_pointer - 2].needs_warning = 1;
/* This if statement can no longer cause a dangling else. */
if_stack[if_stack_pointer - 1]--; /* Even if a nested if statement had an else branch, it can't be
ambiguous if this one also has an else. So don't warn in that
case. Also don't warn for any if statements nested in this else. */
if_stack[if_stack_pointer - 1].needs_warning = 0;
if_stack[if_stack_pointer - 1].compstmt_count--;
expand_start_else (); expand_start_else ();
} }
......
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