Every TeaScript release package used to ship a Deprecation_and_Breaking_Changes.txt
and a Known_Issues.txt. Both files only ever described the release they came with,
and both were overwritten on every version bump β so the moment an issue was fixed or
a deprecated API was finally removed, the record of it disappeared with the next
download.
This page replaces those two files. It carries the complete history instead of a snapshot: every breaking change, every deprecation, every known issue and every experimental feature from 0.9.0 onwards.
How to use these tables
Click a column header's β²/βΌ to sort by it, and use the filter chips above each table to narrow it down. Click any row to reveal its description, workaround and migration notes, or use Expand all to open every row at once.
Some tables open pre-filtered on what is still relevant today β the open issues, the items still deprecated, the features still experimental. The selected chip is highlighted, so switch it to All (or to any other value) to see the full history. A link to a specific entry, such as DEP-15, always shows that entry even when the active filter would otherwise hide it.
About the identifiers. KI-, BC-, DEP- and EXP- numbers are stable
identifiers introduced with this page. They do not match the item numbers from the
old Known_Issues.txt, which were renumbered and reused inconsistently over the years;
those are preserved as a Legacy # field inside each known-issue row, purely so old
release notes can still be cross-referenced.
Reporting new issues. Newly discovered issues are tracked on GitHub Issues, not here. The Known Issues table below is a historical record of what was reported in the release packages, plus the handful of entries that are still open.
Known Issues
Functional issues, platform limitations and rough edges that were tracked as "known issues" across releases β as opposed to the deliberate breaking changes in the next section. Most were eventually fixed, some are still open. The table opens on the still-open ones, newest first β set Status to All for the complete history.
- Legacy #
- 1
- Description
- Literals combining a decimal point and an exponent (e.g.
123.456e-10) could not be parsed. Decimal-only (123.456) or exponent-only (123456e-13) forms worked individually. - Workaround
- None; avoid combining both forms.
- Legacy #
- 2
- Description
- Converting a float to string (and back) lost precision beyond the 5th decimal digit, e.g.
123456e-13displayed as0.000000. - Workaround
- Rescale before converting, to partially recover the magnitude.
- Legacy #
- 3
- Description
- There was no implicit
f64βi64conversion and no cast operator. - Workaround
- Use
_f64toi64/to_i64for f64βi64, andto_f64or+0.0for i64βf64. - Notes
- Resolved by the
ascast operator._f64toi64itself was deprecated later β see DEP-14.
- Legacy #
- 4
- Description
(a := 4, b := 5)did not assign toa, because parentheses containing multiple expressions were reserved for future tuple construction, and tuples were not implemented yet.- Workaround
- None.
- Notes
- Resolved when Tuples were implemented.
- Legacy #
- 5
- Description
- Typing or reading Unicode input whose UTF-16 representation used a surrogate pair could echo incorrectly in the console, due to a WIN32
ReadConsoleWbug. The stored UTF-8 data itself was always correct. - Workaround
- Use "Windows Terminal" together with PowerShell or Command Prompt.
- Notes
- The root cause turned out to be a Windows Terminal bug, fixed upstream in Windows Terminal 1.19.
- Legacy #
- 6
- Description
- Parsing and evaluation errors originating inside in-string (
%()) evaluation can display the wrong source snippet in the pretty-printed error output. - Workaround
- Enable
:debugin the interactive shell,--debugfor script files, orEngine::SetDebugMode(true)in the C++ API.
- Legacy #
- 7
- Description
- Comparing values where at least one operand is a non-finite float (NaN or Infinity) throws
teascript::exception::runtime_error, which cannot be caught from TeaScript code. - Workaround
- Use gcc β₯ 13, or clang with libc++, on Linux.
- Notes
- Affects gcc < 13 and clang with libstdc++. Windows (MSVC), clang with libc++ and gcc β₯ 13 perform a correct total-strong-ordering comparison instead.
- Legacy #
- 8
- Description
- On Linux,
clock_utc()returned UTC time without leap seconds. The underlying implementation was later found to be a misunderstanding ofstd::chrono::utc_clock. - Workaround
- Use gcc β₯ 13 on Linux (interim workaround, pre-0.16.0).
- Notes
- It now returns UTC in
system_clockrepresentation on all platforms β see BC-18.
- Legacy #
- 9
- Description
- The Linux implementation of line reading for the REPL lacked the history and editing niceties available on Windows.
- Workaround
- None.
- Notes
- GNU readline has been used since then.
- Legacy #
- 10
- Description
tup.0.1parses as identifiertup, dot operator, then float literal0.1β so it only accesses index0. Chained.N.Maccess into nested tuples needs explicit grouping:(tup.0).1.- Workaround
- Use the Subscript Operator instead:
tup[0].1ortup[0][1]. - Notes
- Still open, but the subscript-operator workaround has been available since 0.11.0.
- Legacy #
- 11
- Description
- The
debugoperator's output showed a dot instead of the member name for tuple elements, although the element's value printed correctly. - Workaround
- None.
- Legacy #
- 12
- Description
trunc()only worked correctly within the range ofi64, not across the full range off64.- Workaround
- Use
_truncfrom Level Util if affected (before the fix).
- Legacy #
- 13
- Description
- Sending a Suspend Request from another thread to a running compiled TeaScript Binary (
.tsb) in the TeaStackVM is not possible, due to the lack of the C++20 library featurestd::stop_source/std::stop_tokenin that configuration. - Workaround
- Use gcc/g++ on Linux, ideally version 13 or newer.
- Legacy #
- 14
- Description
- In compiled (TeaStackVM) mode, a
stopor loop statement referencing an outer loop from an inner loop is not possible when issued from inside an operand of a unary, binary or subscript operator. It evaluates fine in evaluation mode, but is discouraged there too. - Workaround
- Restructure the code to avoid issuing
stopor loop control from inside an operator operand.
Breaking Changes
One-time behavioral or API changes that shipped with a specific release β as opposed to the gradual deprecate-then-remove lifecycle tracked in the next section. Not every release had breaking changes β the Version chips list only those that did. The table opens sorted by release, newest first.
- Description
- Copy-assigned function parameters (without
def) areconstby default instead of mutable. Shared-assigned (@=) parameters are unaffected. - Migration
- Use an explicit
deforconst. Temporary opt-outs existed via the Host option--old-mutable-parameters(removed in 0.16.0, see DEP-12),Engine::ActivateDeprecatedDefaultMutableParameters()(removed in 0.14.0, see DEP-04),Parser::OverwriteDialect()(experimental, see EXP-01), or#define TEASCRIPT_DEFAULT_CONST_PARAMETERS false. - Platforms
- Any
- Description
eval_filemoved up to Level Core.trunc,ceil,floor,sqrt,file_copy,file_copy_newer,readtextfile,writetextfile,create_dir,path_delete,file_existsandreadtomlfilemoved up to Level Full.- Migration
- Adjust the
CoreLibrary::Bootstrap()config level if these functions are required at a lower level. - Platforms
- Any
- Description
- When compiling in C++23 mode with
<print>available (forstd::vprint_unicode()) and libfmt on the include path, libfmt is now preferred, because it offers more features. - Migration
#define TEASCRIPT_DISABLE_FMTLIB 1inPrint.hppto opt out.- Platforms
- Any
- Description
- They return a complete UTF-8 code point (length 0β4 bytes) instead of a possibly truncated byte. If the requested position lands mid-code-point, the full enclosing glyph is returned.
- Migration
- No migration needed in most cases.
- Platforms
- Any
- Description
- Full UTF-8 validation of the input is performed. Invalid input no longer throws;
Bool(false)is returned instead. - Migration
- Check the return value.
- Platforms
- Any
- Description
- Split into
Util.hpp,UtilContent.hppandUtilInternal.hpp. - Migration
- Usually only
Util.hppstill needs to be included directly. - Platforms
- Any
- Description
- The member function is
constnow. - Migration
- Update overrides and signatures if needed.
- Platforms
- Any
- Description
- It previously threw
std::out_of_range. - Migration
- Catch
exception::parsing_errorinstead. - Platforms
- Any
- Description
- It now inherits from
exception::runtime_error(which carries aSourceLocation) instead ofstd::bad_any_cast. - Migration
- Update catch clauses that relied on
std::bad_any_cast. - Platforms
- Any
- Description
- The overload previously added an
I64. - Migration
- Cast explicitly if an
I64is required. - Platforms
- Any
- Description
- It must be accounted for in any custom visitor passed to
ValueObject::Visit. - Migration
- Handle the
Tuplealternative in visitors. - Platforms
- Any
- Description
_exit()accepts any type of argument as the script's result value, and a script always produces a result orNaV.- Migration
- Use
_exit(Any)or the new_Exitstatement. - Platforms
- Any
- Description
- Arguments are exposed as a Tuple
argsinstead ofarg1,arg2, β¦ . - Migration
- The legacy form is available via the Host option
--legacy-argsorTEASCRIPT_ENGINE_USE_LEGACY_ARGS=1. - Platforms
- Any
- Description
- Required to make the library "opt-out header only".
- Migration
- Access the parser via
mBuildTools. - Platforms
- Any
- Description
- They must be accounted for in any custom visitor passed to
ValueObject::Visit. - Migration
- Handle the new alternatives in visitors.
- Platforms
- Any
- Description
- A dedicated
Errortype and a Zig-likecatchstatement for error handling were added, e.g.def n := _strtonum("abc") catch 2. - Migration
- The
Errortype is still experimental β see EXP-04. - Platforms
- Any
- Description
- Parameters without an assign specifier are shared-assign (
@=) by default. Explicit shared parameters withoutconstordefbecome implicitauto, resolved toconstor mutable depending on the passed argument. - Migration
- Disable via the
TEASCRIPT_DEFAULT_SHARED_PARAMETERS/TEASCRIPT_DEFAULT_SHARED_AUTO_PARAMETERSdefines, a customDialectinstance, or the Host option--old-deepcopy-parameters. - Platforms
- Any
- Description
- This removes the leap-second counting behavior on Windows and on Linux with gcc β₯ 13, eliminating an unwanted offset from system time.
- Migration
- No migration needed. Resolves KI-08.
- Platforms
- Windows, Linux (gcc β₯ 13)
- Description
- It was accidentally
const @=; a const-correctness bug had made it appear to accept const strings. It no longer accepts a const string as input. - Migration
- Pass a mutable string, or copy first.
- Platforms
- Any
- Description
- Affects
_strtonum/_strtonumex,to_i64/to_f64,_strfromascii,read[text]file,read[toml\|json]file,read[toml\|json]string,write[toml\|json]string,read/writebsonbufferand all_buf_get_xfunctions. - Migration
- Check for the
Errortype instead of, or in addition to,Bool(false). - Platforms
- Any
- Description
- Requesting a non-const reference to a const inner value now throws
exception::bad_value_castinstead of silently allowing mutation. - Migration
- Use
GetValue<Type const>(), or the newGetConstValue()/GetMutableValue()/GetValueCopy(). The macroTEASCRIPT_DISABLE_GETVALUE_CONSTCHECKrestored the old behavior temporarily and was removed in 0.17.0 β see DEP-15. - Platforms
- Any
- Description
- Nested const elements are skipped when the functor takes a mutable
ValueObject, instead of allowing const elements to be modified through it. - Migration
- Use a const-taking functor to visit const elements.
- Platforms
- Any
- Description
- The member function name was misspelled before.
- Migration
- Update call sites to the corrected name.
- Platforms
- Any
Deprecated and Removed Items
Items that went β or are going β through TeaScript's deprecate-then-remove lifecycle, on the language and Core Library level as well as the C++ API level. All of them apply to every platform. The table opens on the items that are still deprecated but not yet removed β set Status to All for the complete history.
Entries marked Source scan only carry a deprecation marker in the
C++ Library source but were never announced in a released
Deprecation_and_Breaking_Changes.txt. They are candidates for a future release's
notes rather than confirmed deprecations. DEP-18 is a step earlier still β
its replacement API already exists, but the old one is not deprecated yet.
- Description
- The old two-argument bootstrap overload.
- Replacement
- Use
Bootstrap(Context &rContext, config::eConfig const config). - Notes
- ΒΉ The 0.11.0 release package shipped no
Deprecation_and_Breaking_Changes.txt, so the exact version this was deprecated in could not be confirmed from the release notes.
- Description
- An ambiguous, confusingly named generic
eval. - Replacement
- Use
_eval(code_string).
- Description
- Superseded by more precise parsing entry points.
- Replacement
- Use
Integer(Content&)orNum(Content&, bool).
- Description
- The interim opt-out for the 0.12.0 const-parameter default change.
- Replacement
- Change script code to use explicit
defparameters. - Notes
- Introduced by BC-01.
- Description
- The implementation behind
_f64toi64. - Replacement
- Use
static_cast<long long>directly in C++.
- Description
- Renamed for clarity.
- Replacement
- Use
ApplyBinaryOp()/ApplyUnaryOp().
- Description
- Renamed for clarity.
- Replacement
- Use
InjectVars().
- Description
- An obsolete constructor overload.
- Replacement
- Use a different constructor.
- Description
- A direct control-flow exception for script exit.
- Replacement
- Use
_exit()or the_Exitstatement. From C++, throwteascript::control::Exit_Scriptdirectly. - Notes
- Part of the exit-code rework, see BC-12.
- Description
- The separate exit-code concept.
- Replacement
- Use
_exit(Any)or the_Exitstatement. - Notes
- Part of the exit-code rework, see BC-12.
- Description
- The separate exit-code concept, on the C++ API side.
- Replacement
- A script always produces a result or
NaVnow. - Notes
- Part of the exit-code rework, see BC-12.
- Description
- The interim opt-out for the 0.12.0 const-parameter default change.
- Replacement
- Change scripts to use explicit
defparameters, or use a customDialectinstance. - Notes
- Β² Flagged as "will be deprecated" in the 0.12.0 breaking-changes notes, but never listed in a "now deprecated" section of any release until its removal was announced directly in 0.16.0. Introduced by BC-01.
- Description
- The fixed-arity library-function wrapper templates.
- Replacement
- Use the generic
LibraryFunction<>, which takes any arity and an optionalContextfirst parameter. - Notes
- The generic replacement was already in use internally by the experimental WebPreview module (EXP-07) in 0.15.0 β a full release before these were formally deprecated.
- Description
- The Core Library function converting f64 β i64.
- Replacement
- Use the
ascast operator (recommended), orto_i64. - Notes
- Still deprecated, not yet removed as of 0.17.0. Originally the workaround for KI-03.
- Description
- The temporary opt-out for the 0.16.0
GetValue()const-correctness fix. - Replacement
- Use
GetValue<Type const>(),GetConstValue(),GetMutableValue()orGetValueCopy(). - Notes
- Deprecated on arrival and removed one release later. Introduced by BC-21.
- Description
- A legacy alias for
TypeI64, predating theI64naming. - Replacement
- Use
TypeI64. - Notes
- Marked in a source comment only; never announced in any release notes.
- Description
- A legacy alias for
TypeF64, predating theF64naming. - Replacement
- Use
TypeF64. - Notes
- Marked in a source comment only; never announced in any release notes.
- Description
- Marked in source as "will become deprecated" because of its complicated const usage. It is not formally deprecated yet.
- Replacement
- Prefer
GetConstValue(),GetMutableValue()orGetValueCopy()already now. - Notes
- The replacement API has been available since 0.16.0, see BC-21.
Experimental Features and APIs
Features and API surfaces explicitly marked as experimental, either through an
EXPERIMENTAL marker in the source code or as prose in the release notes and
changelog. Experimental means the interface, the behavior or the existence of a
feature may change or be removed without going through the normal deprecation
cycle.
The Stabilized in column tracks graduation out of experimental status. Most entries are still experimental. The table opens on those β set Status to All to include the ones that have graduated.
- Description
- Overwriting the default
Dialectcreates an unofficial or legacy TeaScript language dialect β for example restoring the old mutable-parameter defaults at a low level. The interface "may change often or be removed entirely." - Notes
- A low-level escape hatch. Prefer the standard dialect unless legacy or custom behavior is specifically needed.
- Description
Engine/EngineBase::RegisterUserCallback(),CallbackFuncandUserCallbackFuncregister arbitrary C++ callbacks that become callable as normal TeaScript functions. The interface, its members and the general mechanics "may change."- Notes
- The longest-lived experimental feature, spanning roughly eight releases, and already widely used in the demos despite the status.
- Description
- A dedicated Engine variant for coroutine-style script execution with suspend and resume. The class as well as its interface and layout are "considered EXPERIMENTAL."
- Description
- A dedicated
Errortype (code plus message) withcatchandtrystatement sugar for Zig-like error handling. "All Error related classes and functions are considered EXPERIMENTAL." - Notes
catcharrived in 0.16.0,trywas added in 0.17.0. Also a breaking change, see BC-16.
- Description
- Parameters without an assign specifier default to shared-assign, and explicit shared parameters without
constordefbecome implicitauto. "Experimental but activated by default." - Notes
- Also a breaking change, see BC-17.
- Description
- Tuple β BSON buffer conversion, available only when the nlohmann::json adapter and
TEASCRIPT_BSONSUPPORTare enabled at build time. - Notes
- Gated behind build configuration.
- Description
web_get,web_post,web_server_setup,web_server_accept,web_server_reply,web_server_build_reply,web_set_payload,web_add_headerandweb_build_request. The first module built on the experimentalIModuleinterface; it must be enabled manually and, once enabled, is always loaded into the Context β there is no on-demand loading from scripts yet. Versioned "Preview 0."
- Description
- Reflects C++ structs into TeaScript Tuples and back, built on the third-party
reflectcpplibrary. - Notes
- An optional extension, not part of the Core Library.
- Description
- Exposes the TeaStackVM's working-variable stack and call stack for debugging. Using them while the machine is running is a data race, and therefore undefined behavior.
- Notes
- Introduced together with the TeaStackVM. Debug use only, never concurrently with a running machine.
- Description
- Builds a string representation of a chain of nested dot operators, for introspection and debugging.
- Description
- Introspection helpers for partial, interactive line-by-line parsing state.
- Notes
- Distinct from the older
Parser::Get[Final]PartialParsedASTNodes()(EXP-15), which graduated in 0.14.0.
- Description
- A compile-time and eval-time concept for checking the constness of a variable.
- Notes
- Stabilized alongside EXP-13 to EXP-15 in the same commit batch.
- Description
- An AST node type representing a parsed file part or fragment.
- Notes
- Β³ Best effort: located via
git log -S"class ASTNode_FilePart"rather than named inchangelog.txt. Introduced by the same commit that added EXP-15's original interface.
- Description
- A mechanism for passing arbitrary opaque C++ data through TeaScript values and calls without conversion.
- Notes
- Still in active use today β the WebPreview module (EXP-07) relies on it β it is simply no longer flagged experimental.
- Description
- The original interface for partial, line-by-line parsing introspection.
- Notes
- Superseded by the newer, still experimental
ParsingStatepartial-parsing API (EXP-11).
Cross-references worth noting
- KI-08 β BC-18 β the
clock_utc()known issue was ultimately fixed as part of a breaking change in 0.16.0. - BC-01 β DEP-04 β DEP-12 β the 0.12.0 default-constness breaking change spawned two separate deprecated opt-outs, removed in two different later releases (0.14.0 and 0.16.0 respectively).
- BC-21 β DEP-15 β the 0.16.0
GetValue()const-correctness fix shipped with its own temporary escape-hatch macro, which became deprecated-on-arrival and was removed one release later, in 0.17.0. - DEP-13 β EXP-07 β
LibraryFunction0β¦LibraryFunction5were being replaced by the new genericLibraryFunction<>, first used internally by the experimental WebPreview module in 0.15.0 β a full release before the old classes were even formally deprecated in 0.16.0. - EXP-12 β¦ EXP-15 β four unrelated experimental features (a language concept, an AST node type, a data-passthrough mechanism and a parser introspection interface) all graduated to stable status in the same 0.14.0 commit. It is the only batch stabilization in the project's history to date.
Per-release detail lives in the release articles, and older packages in the Release Archive.