/* 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.
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;
if (current_cframe == NULL)
{
as_bad (_("\".elseif\" without matching \".if\" - ignored"));
-
}
else if (current_cframe->else_seen)
{
if (!current_cframe->dead_tree)
{
+ current_cframe->dead_tree = !current_cframe->ignoring;
current_cframe->ignoring = !current_cframe->ignoring;
if (LISTING_SKIP_COND ())
{
} /* 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)
{