diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d92bfd42e9f379687223413425f63ba8cd59b18e..2d4a86a855089e1e8e2acf7483a4c86cec459a2c 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,9 +1,13 @@
-2005-08-14 Paul Thomas  <pault@gcc.gnu.org>
+2005-08-14  Asher Langton  <langton2@llnl.gov>
+
+	* parse.c (match): Enclosed macro in do...while(0) and braces.
+
+2005-08-14  Paul Thomas  <pault@gcc.gnu.org>
 
 	PR fortran/21432.
 	* gfortran.texi: Document PRINT namelist.
 
-2005-08-14 Paul Thomas  <pault@gcc.gnu.org>
+2005-08-14  Paul Thomas  <pault@gcc.gnu.org>
 
 	PR fortran/21432.
 	* io.c (match_io): Add code to implement PRINT namelist.
@@ -178,7 +182,7 @@
 	* trans-stmt.c (gfc_trans_character_select): Use
 	build_constructor_from_list instead of build_constructor.
 
-2005-07-19 Paul Thomas  <pault@gcc.gnu.org>
+2005-07-19  Paul Thomas  <pault@gcc.gnu.org>
 
 	PR fortran/16940
 	* resolve.c (resolve_symbol): A symbol with FL_UNKNOWN
@@ -918,7 +922,7 @@
 	* resolve.c (resolve_variable): If e->symtree is not set, this
 	ought to be a FAILURE, and not a segfault.
 
-2005-04-17 Paul Thomas <pault@gcc.gnu.org>
+2005-04-17  Paul Thomas <pault@gcc.gnu.org>
 
 	PR fortran/17472
 	PR fortran/18209
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 2894e505b3d3114e43f4544f0d769dd07ac9f92c..9c404d5bebed354bc5ad5eb24d7f0d86852a200a 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -75,13 +75,16 @@ match_word (const char *str, match (*subr) (void), locus * old_locus)
 
 
 /* Figure out what the next statement is, (mostly) regardless of
-   proper ordering.  */
+   proper ordering.  The do...while(0) is there to prevent if/else
+   ambiguity.  */
 
 #define match(keyword, subr, st)				\
-    if (match_word(keyword, subr, &old_locus) == MATCH_YES)	\
-      return st;						\
-    else							\
-      undo_new_statement ();
+    do {                                                        \
+      if (match_word(keyword, subr, &old_locus) == MATCH_YES)	\
+        return st;						\
+      else							\
+        undo_new_statement ();                                  \
+    } while (0);
 
 static gfc_statement
 decode_statement (void)