Saltar al contenido

Rust 1.100 llega con el tipo never, asignadores y lints de Cargo

Rust 1.100.0 salió el 12 de noviembre. En una prueba de Tech AI Wire, el código que silenciaba el lint del tipo never en Rust 1.99 ya no compila en 1.100.

Por

4 min de lectura

XLinkedIn

Traducido automáticamente del original en inglés, que Claire Whitmore verificó y editó. Prevalece la versión en inglés. Cómo trabajamos

Screenshot of the Rust Blog post 'Announcing Rust 1.100.0', dated November 12, 2026 and signed by the Rust Release Team, showing the rustup update stable command.

En cifras

fecha de lanzamiento de Rust 1.100.0
12 nov. 2026
pasó el tipo never como inestable antes de esta versión
10 años
de antigüedad mínima de publicación en la configuración de ejemplo del propio Cargo
3 días

El proyecto Rust lanzó Rust 1.100.0 el 12 de noviembre de 2026. La versión estabiliza el tipo never, abre el núcleo de la API de asignadores personalizados y enseña a Cargo a avisar de las dependencias sin usar. El cambio del tipo never también rompe la compatibilidad, y las notas de la versión lo incluyen en "Compatibility Notes". Proyectos de cualquier edición pueden ahora fallar al compilar donde antes compilaban.

El anuncio en el Rust Blog dice que el tipo never tardó 10 años y 5 intentos fallidos en llegar a estable. LWN.net abrió con los mismos tres cambios: el tipo never, el núcleo de la Allocator API y el informe de Cargo sobre dependencias sin usar. Los usuarios de Rust actualizan con rustup update stable.

Qué hay de nuevo en Rust 1.100

El tipo never, escrito !, es el tipo del código que nunca termina, como un panic! o un bucle infinito. Hasta ahora solo podía aparecer como tipo de retorno de una función. Nuestra guía sobre el tipo never de Rust lo explica a fondo, y nuestra noticia de agosto cubrió el pull request que lo hizo estable.

La tabla siguiente se basa en la entrada del blog, las notas de la versión en GitHub y el registro de cambios de Cargo.

CambioQué haceQuién lo nota
Tipo never !Se puede usar en cualquier parte, como en Result<T, !>; Infallible pasa a ser un alias de !El código que dependía del antiguo fallback
Fallback de tiposUn tipo desconocido en una rama divergente ahora pasa a ser !, no (), en todas las edicionesCrates antiguos que nunca pasaron a la edición 2024
Allocator APIAllocator, Global, System, y Vec::new_in, Box::new_in y métodos similaresEl código que gestiona su propia memoria
cargo::unused_dependenciesAvisa cuando una dependencia de Cargo.toml nunca se usaTodos los proyectos de Cargo
Antigüedad mínima de publicaciónCargo puede saltarse versiones de crates más nuevas que una antigüedad fijadaEquipos preocupados por los ataques a la cadena de suministro
Estructura del directorio de compilaciónLos archivos intermedios de compilación cambian de sitioScripts que leen directamente la carpeta target de Cargo
i686-pc-windows-gnuAhora es Tier 2 sin herramientas de hostUsuarios de Windows de 32 bits

El cambio para Windows de 32 bits se anunció en octubre, como explica nuestra noticia sobre los targets i686. La versión también estabiliza utilidades más pequeñas, como bool::toggle, Vec::from_fn y str::trim_prefix.

Prueba de Tech AI Wire: Rust 1.99.1 frente a 1.100.0

En una prueba de Tech AI Wire en macOS 26.6.2, los mismos proyectos pequeños se ejecutaron en las imágenes oficiales de Docker rust:1.99-slim y rust:1.100-slim. Ambas son Debian 13 sobre arm64. Las imágenes indicaron rustc 1.99.1 y rustc 1.100.0.

El primer proyecto usaba la edición 2021 y este código:

fn make<T: Default>() -> Result<T, ()> {
    Ok(T::default())
}

fn main() -> Result<(), ()> {
    make()?;
    Ok(())
}

Nada le dice al compilador qué es T, así que recurre a un tipo por defecto. Esto hizo cada versión:

CódigoRust 1.99.1Rust 1.100.0
Tal cualError del lint dependency_on_unit_never_type_fallbackError E0277: "the trait bound !: Default is not satisfied" (no se cumple el límite de trait !: Default)
Con #![allow(dependency_on_unit_never_type_fallback)]Compila y se ejecutaSigue el error E0277; el lint "has been removed" (se ha eliminado)
Con make::<()>()?Compila y se ejecutaCompila y se ejecuta

La fila del medio es la trampa. Un crate que silenciaba el aviso en 1.99 compila allí y luego falla en 1.100. Rust 1.100 explica que el lint se eliminó porque "the code warned by this lint no longer compiles" (el código sobre el que avisaba este lint ya no compila). Solo se arregla indicando el tipo.

La prueba del asignador personalizado envolvía el asignador global para contar las peticiones. En 1.99.1 falló con el error E0658, "use of unstable library feature allocator_api". En 1.100.0 funcionó en stable. Un Vec de 1.000 números más un Box hicieron 10 llamadas de asignación por 16.356 bytes.

Prueba de Tech AI Wire: los dos nuevos controles de seguridad de Cargo

Un crate (un paquete de Rust) declaraba itoa y memchr como dependencias, pero solo usaba itoa. En 1.100, cargo build mostró "warning: unused dependency memchr". Poner unused_dependencies = "deny" bajo [lints.cargo] lo convirtió en un error, y la compilación se detuvo. Una dev-dependency que nunca se usó no recibió ningún aviso. Tampoco cargo check --bin unused, que revisa un solo target. Ambos casos coinciden con exenciones que enumera la entrada del blog. Rust 1.99.1 ignoró la tabla [lints.cargo] con un aviso "unused manifest key".

La antigüedad mínima de publicación retrasa las versiones de crates recién publicadas, lo que la entrada del blog llama "dependency cooldowns". La espera da tiempo a otros para detectar una mala versión antes de que tu compilación la incorpore. Con global-min-publish-age = "3 days" bajo [registry], Cargo fijó cc en 1.11.1. Mostró "available: v1.11.2, published 2 hours ago". Sin el ajuste, Cargo eligió 1.11.2. Con 30 días, la resolución falló, porque cargo add ya había escrito 1.11.1 como versión mínima. Cargo sugirió bajar el requisito a "1.8.0" o definir CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow.

Qué significa para los desarrolladores

  • Compila cada crate con 1.100 antes de actualizar la CI. El código de ediciones antiguas es el que más probablemente se rompa. Busca allow(dependency_on_unit_never_type_fallback), porque ese código falla en 1.100.
  • Corrige los errores de fallback indicando el tipo. La propia sugerencia del compilador, como make::<()>(), funcionó en ambas versiones durante la prueba.
  • Activa ya la antigüedad mínima de publicación. Tres días de global-min-publish-age en .cargo/config.toml cuestan poco. Configúrala antes de ejecutar cargo add, ya que ese comando escribe en Cargo.toml la versión que elige.
  • Limpia las dependencias sin usar antes de prohibirlas. Empieza con el nivel por defecto warn, elimina lo que encuentre y luego cambia a deny en la CI.
  • Lee las Compatibility Notes. También incluyen la eliminación de los patrones box, Unicode 18.0.0 y comprobaciones más estrictas de target features de ARM.
  • Deja de leer directamente las carpetas de compilación de Cargo. Su estructura cambió en 1.100, y el registro de cambios de Cargo dice que las herramientas deben usar en su lugar los mensajes JSON de Cargo.

Fuentes

  1. Announcing Rust 1.100.0 - Rust Blog
  2. Rust 1.100.0 release notes - GitHub - rust-lang/rust
  3. Cargo changelog: Cargo 1.100 - The Cargo Book
  4. Rust 1.100.0 released - LWN.net
rustcompilerssupply-chain

Artículos relacionados