summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2002-10-29 10:56:38 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2002-10-29 10:56:38 +0000
commitff23ebe925752236ecf28318feee0a7f40e34e8e (patch)
tree9514c4f5724a652254f2e8a204c465c3c6cbea84 /Src
parent7bfc0f1b5c3f4f02193d7b5e1d631b224e054f8b (diff)
downloadzsh-ff23ebe925752236ecf28318feee0a7f40e34e8e.tar.gz
zsh-ff23ebe925752236ecf28318feee0a7f40e34e8e.tar.xz
zsh-ff23ebe925752236ecf28318feee0a7f40e34e8e.zip
17872: Fix `typeset SECONDS' when creating local parameter
Diffstat (limited to 'Src')
-rw-r--r--Src/builtin.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index 9f1c2dcb6..045c80f36 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -1732,11 +1732,30 @@ typeset_single(char *cname, char *pname, Param pm, int func,
 	    int err = 1;
 	    if (!readonly && !strcmp(pname, "SECONDS"))
 	    {
+		/*
+		 * We allow SECONDS to change type between integer
+		 * and floating point.  If we are creating a new
+		 * local copy we check the type here and allow
+		 * a new special to be created with that type.
+		 * We then need to make sure the correct type
+		 * for the special is restored at the end of the scope.
+		 * If we are changing the type of an existing
+		 * parameter, we do the whole thing here.
+		 */
 		if (newspecial != NS_NONE)
 		{
-		    newspecial = NS_SECONDS;
-		    err = 0;	/* and continue */
-		    tc = 0;	/* but don't do a normal conversion */
+		    /*
+		     * The first test allows `typeset' to copy the
+		     * existing type.  This is the usual behaviour
+		     * for making special parameters local.
+		     */
+		    if (PM_TYPE(on) == 0 || PM_TYPE(on) == PM_INTEGER ||
+			PM_TYPE(on) == PM_FFLOAT || PM_TYPE(on) == PM_EFLOAT)
+		    {
+			newspecial = NS_SECONDS;
+			err = 0;	/* and continue */
+			tc = 0;	/* but don't do a normal conversion */
+		    }
 		} else if (!setsecondstype(pm, on, off)) {
 		    if (value && !setsparam(pname, ztrdup(value)))
 			return NULL;