diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2002-10-29 10:56:38 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2002-10-29 10:56:38 +0000 |
commit | ff23ebe925752236ecf28318feee0a7f40e34e8e (patch) | |
tree | 9514c4f5724a652254f2e8a204c465c3c6cbea84 /Src/builtin.c | |
parent | 7bfc0f1b5c3f4f02193d7b5e1d631b224e054f8b (diff) | |
download | zsh-ff23ebe925752236ecf28318feee0a7f40e34e8e.tar.gz zsh-ff23ebe925752236ecf28318feee0a7f40e34e8e.tar.xz zsh-ff23ebe925752236ecf28318feee0a7f40e34e8e.zip |
17872: Fix `typeset SECONDS' when creating local parameter
Diffstat (limited to 'Src/builtin.c')
-rw-r--r-- | Src/builtin.c | 25 |
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; |