about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Doc/Zsh/func.yo11
-rw-r--r--Src/parse.c10
-rw-r--r--Test/C04funcdef.ztst6
4 files changed, 30 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 3c0265440..c6209fca0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-08-03  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* 29633: Doc/Zsh/func.yo, Src/parse.c, Test/C04funcdef.ztst: be
+	more careful that anonymous function syntax doesn't mess up
+	working syntax with other functions.
+
 2011-08-03  Peter Stephenson  <pws@csr.com>
 
 	* 29635: Completion/Base/Widget/_complete_debug: Improve file
@@ -15189,5 +15195,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5413 $
+* $Revision: 1.5414 $
 *****************************************************
diff --git a/Doc/Zsh/func.yo b/Doc/Zsh/func.yo
index 89b956cb4..7c391f80d 100644
--- a/Doc/Zsh/func.yo
+++ b/Doc/Zsh/func.yo
@@ -162,8 +162,15 @@ is not stored for future use.  The function name is set to `tt((anon))'.
 
 Arguments to the function may be specified as words following the
 closing brace defining the function, hence if there are none no
-arguments (other than tt($0)) are set.  Note that this means
-the argument list of any enclosing script or function is hidden.
+arguments (other than tt($0)) are set.  This is a difference from the
+way other functions are parsed: normal function definitions may be
+followed by certain keywords such as `tt(else)' or `tt(fi)', which will
+be treated as arguments to anonymous functions, so that a newline or
+semicolon is needed to force keyword interpretation.
+
+Note also that the argument list of any enclosing script or function is
+hidden (as would be the case for any other function called at this
+point).
 
 Redirections may be applied to the anonymous function in the same manner as
 to a current-shell structure enclosed in braces.  The main use of anonymous
diff --git a/Src/parse.c b/Src/parse.c
index 5b8f0af48..e4d038b6e 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -1465,7 +1465,10 @@ par_funcdef(void)
 	    ecssub = oecssub;
 	    YYERRORV(oecused);
 	}
-	incmdpos = 0;
+	if (num == 0) {
+	    /* Anonymous function, possibly with arguments */
+	    incmdpos = 0;
+	}
 	zshlex();
     } else if (unset(SHORTLOOPS)) {
 	lineno += oldlineno;
@@ -1721,7 +1724,10 @@ par_simple(int *complex, int nr)
 		    ecssub = oecssub;
 		    YYERROR(oecused);
 		}
-		incmdpos = 0;
+		if (argc == 0) {
+		    /* Anonymous function, possibly with arguments */
+		    incmdpos = 0;
+		}
 		zshlex();
 	    } else {
 		int ll, sl, c = 0;
diff --git a/Test/C04funcdef.ztst b/Test/C04funcdef.ztst
index 742d2d0a7..90f01e397 100644
--- a/Test/C04funcdef.ztst
+++ b/Test/C04funcdef.ztst
@@ -245,6 +245,12 @@
 >empty
 >here
 
+  if true; then f() { echo foo1; } else f() { echo bar1; } fi; f
+  if false; then f() { echo foo2; } else f() { echo bar2; } fi; f
+0:Compatibility with other shells when not anonymous functions
+>foo1
+>bar2
+
 %clean
 
  rm -f file.in file.out