diff options
author | Alan Modra <amodra@gmail.com> | 2001-03-31 02:06:24 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2001-03-31 02:06:24 +0000 |
commit | cdbc6895e50c685493695b864b5c6f4e0eca23ea (patch) | |
tree | 248b5913566264e1113711b9b34ba50d5fb9114b /gas/cond.c | |
parent | 40564acad470c2f68f66f85c5969839a30a0b66f (diff) | |
download | gdb-cdbc6895e50c685493695b864b5c6f4e0eca23ea.zip gdb-cdbc6895e50c685493695b864b5c6f4e0eca23ea.tar.gz gdb-cdbc6895e50c685493695b864b5c6f4e0eca23ea.tar.bz2 |
* cond.c (s_endif): Correct handling of "if .. elseif .." trees.
Don't abort on NULL current_cframe.
Diffstat (limited to 'gas/cond.c')
-rw-r--r-- | gas/cond.c | 28 |
1 files changed, 14 insertions, 14 deletions
@@ -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) { |