# TIP 664: Enable compiler warnings for missing int → Tcl_Size conversions
Author: Jan Nijtmans <[email protected]>
State: Final
Type: Project
Vote: Done
Created: 02-05-2023
Tcl-Version: 9.0
Tcl-Branch: tip-664
Vote-Summary: Accepted 7/0/0
Votes-For: AF, AK, DKF, JN, KW, MC, SL
Votes-Against: none
Votes-Present: none
-----
# Abstract
The TIPs [481](https://core.tcl-lang.org/tips/doc/trunk/tip/481.md)
and [616](https://core.tcl-lang.org/tips/doc/trunk/tip/616.md)
introduced macro constructs which hide the C API changes from Tcl 8.6
to Tcl 9 and disable compiler warnings. This tip proposes to enable
those compiler warnings, as a help for people who want to make their
extension fully capable of handling strings > 2^31.
If users want to disable this warning they can do that by using
their normal compiler options, e.g. (for clang/gcc):
<pre>
configure CFLAGS=-Wno-incompatible-pointer-types
</pre>
Users disabling/ignoring this warning are not harmed in any way,
although it is not recommended. This should encourage, rather
than force, extension writers to update their code.
All _battery-included_ extensions (`Itcl`, `tdbc*`, `thread`) are
already converted to use `Tcl_Size` everywhere necessary.
# Rationale
When TIPs [481](https://core.tcl-lang.org/tips/doc/trunk/tip/481.md)
and [616](https://core.tcl-lang.org/tips/doc/trunk/tip/616.md) were
implemented/proposed, the `Tcl_Size` type didn't exist yet. The
main goal for Tcl 9.0 was - at that time - to keep everything
source-compatible as much as possible.
That means that extensions using `Tcl_GetStringFromObj(obj, &len)`
- where `len` points to an `int` variable - should keep working as-is.
Currently, extension-writers are starting to make their extensions
Tcl-9-ready, which means that they are able to use string/list lengths
> 2^31. That means the `int len` variable has to be replaced
by a `Tcl_Size len` variable. But Tcl doesn't provide any
help finding those instances. This TIP makes it much easier
for extension-writers to find those places in their code,
without any functional disadvantage: If the compiler warning
is ignored, still the extension will work as expected as
long as no strings/lists exceed the 2^31 limit.
# Implementation
Implementation is in [Tcl branch "tip-664"](https://core.tcl-lang.org/tcl/timeline?r=tip-664).
It only removes a lot of type-casts from `tclDecls.h`, which were
originally put there just to prevent this compiler-warning. There
is no change in implementation of any functions, so the only
effect of this proposal is to enable compiler-warnings for this
specific case, nothing else.
# Compatibility
If an extension which is originally written for Tcl 8.6 is built
with Tcl 9 and the compiler warnings are ignored by the developer,
and no strings or lists are used larger than 2^31 in size,
everything will function as before. Any use of strings or lists
larger then that in the extension will result in an error-message,
wherever possible. Only `Tcl_GetStringFromObj()` and `Tcl_GetUnicodeFromObj()`
are not capable of returning an error-message, they will panic (as they do now).
# Copyright
This document has been placed in the public domain.