aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/cond.c28
2 files changed, 19 insertions, 14 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 0f1529b..d73ab69 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2001-03-31 Alan Modra <alan@linuxcare.com.au>
+
+ * cond.c (s_endif): Correct handling of "if .. elseif .." trees.
+ Don't abort on NULL current_cframe.
+
2001-03-30 Alan Modra <alan@linuxcare.com.au>
* dwarf2dbg.c (dwarf2_directive_file): Fix warnings.
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)
{