aboutsummaryrefslogtreecommitdiff
path: root/gas/cond.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2001-03-31 02:06:24 +0000
committerAlan Modra <amodra@gmail.com>2001-03-31 02:06:24 +0000
commitcdbc6895e50c685493695b864b5c6f4e0eca23ea (patch)
tree248b5913566264e1113711b9b34ba50d5fb9114b /gas/cond.c
parent40564acad470c2f68f66f85c5969839a30a0b66f (diff)
downloadgdb-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.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/gas/cond.c b/gas/cond.c
index e402c31..034796b 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)
{