From: Alan Modra Date: Sat, 31 Mar 2001 02:06:24 +0000 (+0000) Subject: * cond.c (s_endif): Correct handling of "if .. elseif .." trees. X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=472e00db4b7e2b3ee16b0b240c7a5985e6cd4d40;p=pf3gnuchains%2Fpf3gnuchains3x.git * cond.c (s_endif): Correct handling of "if .. elseif .." trees. Don't abort on NULL current_cframe. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 0f1529be6b..d73ab69d56 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2001-03-31 Alan Modra + + * cond.c (s_endif): Correct handling of "if .. elseif .." trees. + Don't abort on NULL current_cframe. + 2001-03-30 Alan Modra * dwarf2dbg.c (dwarf2_directive_file): Fix warnings. diff --git a/gas/cond.c b/gas/cond.c index e402c31743..034796b2e3 100644 --- a/gas/cond.c +++ b/gas/cond.c @@ -1,5 +1,5 @@ /* cond.c - conditional assembly pseudo-ops, and .include - Copyright 1990, 1991, 1992, 1993, 1995, 1997, 1998, 2000 + Copyright 1990, 1991, 1992, 1993, 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -47,7 +47,9 @@ struct conditional_frame { int else_seen; /* Whether we are currently ignoring input. */ int ignoring; - /* Whether a conditional at a higher level is ignoring input. */ + /* Whether a conditional at a higher level is ignoring input. + Set also when a branch of an "if .. elseif .." tree has matched + to prevent further matches. */ int dead_tree; /* Macro nesting level at which this conditional was created. */ int macro_nest; @@ -259,7 +261,6 @@ s_elseif (arg) if (current_cframe == NULL) { as_bad (_("\".elseif\" without matching \".if\" - ignored")); - } else if (current_cframe->else_seen) { @@ -278,6 +279,7 @@ s_elseif (arg) if (!current_cframe->dead_tree) { + current_cframe->dead_tree = !current_cframe->ignoring; current_cframe->ignoring = !current_cframe->ignoring; if (LISTING_SKIP_COND ()) { @@ -289,21 +291,19 @@ s_elseif (arg) } /* if not a dead tree */ } /* if error else do it */ - /* Leading whitespace is part of operand. */ - SKIP_WHITESPACE (); - - if (current_cframe != NULL && current_cframe->ignoring) + if (current_cframe == NULL || current_cframe->ignoring) { - operand.X_add_number = 0; while (! is_end_of_line[(unsigned char) *input_line_pointer]) ++input_line_pointer; + return; } - else - { - expression (&operand); - if (operand.X_op != O_constant) - as_bad (_("non-constant expression in \".elseif\" statement")); - } + + /* Leading whitespace is part of operand. */ + SKIP_WHITESPACE (); + + expression (&operand); + if (operand.X_op != O_constant) + as_bad (_("non-constant expression in \".elseif\" statement")); switch ((operatorT) arg) {