Referência de Diagnósticos
Todos os erros, avisos e lints emitidos pelo toolchain do Zolo. Clique em um código para ver a explicação completa, a causa típica e a correção recomendada.
71 / 126 com explicação completa
Lint · 24
float-equality Comparando floats com `==` ou `!=` A igualdade entre floats é imprecisa. Use `~=` (tolerância adaptativa), `!~=`, ou `math.approx_eq_abs/_rel(...)`. Para comparações exatas, use o tipo `decimal`.
unused-variable Variável não utilizada Uma variável `let` ou parâmetro nunca é lida. Prefixe o nome com `_` para silenciar o lint intencionalmente.
unused-function Função não utilizada Uma função top-level nunca é chamada e não está marcada com `pub`, `@test`, `@bench`, `@export`, rota HTTP ou `main`.
unused-import Import não utilizado apenas resumoUm nome importado nunca é referenciado no arquivo.
shadowed-variable Variável faz shadowing de um binding externo apenas resumoUm `let` re-vincula um nome de um escopo externo. Shadowing às vezes é intencional; renomeie um dos bindings para silenciar o aviso.
dead-code Código morto após instrução terminal apenas resumoCódigo depois de `return`, `break` ou `continue` é inalcançável.
naming-convention Violação da convenção de nomes Funções/variáveis usam `snake_case`; structs/enums/traits/efeitos usam `PascalCase`.
must-use Valor `@must_use` descartado apenas resumoUma função ou tipo anotado com `@must_use` retornou um valor que o chamador descartou. Vincule-o (`let _ = ...`) ou consuma-o.
deprecated Uso de item deprecated apenas resumoUma função anotada com `@deprecated` foi chamada. A mensagem da anotação explica a substituição.
infinite-loop Loop infinito sem saída apenas resumoUm bloco `loop`/`while true` não tem nenhum `break`/`return` alcançável.
optional-typo Provável erro de digitação em acesso opcional apenas resumoUm uso de `Some(...)` / `None` / `?.` / `??` que parece um erro de digitação ou mau uso da API de opcional.
non-exhaustive-match `match` não exaustivo Um `match` sobre um enum não cobre todas as variantes e não tem um braço curinga `_`.
unreachable-pattern Braço de `match` inalcançável apenas resumoUm padrão nunca casa porque um braço anterior já o cobre.
max-line-length Linha excede o comprimento máximo configurado apenas resumoConfigurado via lint config do projeto. O padrão é permissivo; aperte no CI se quiser limites rígidos.
max-nesting-depth Bloco aninhado além do permitido apenas resumoAninhamento profundo prejudica a legibilidade. Extraia helpers ou use guard clauses com return cedo.
max-parameters Função com parâmetros demais apenas resumoListas longas de parâmetros são um code-smell. Considere agrupar parâmetros relacionados em uma struct.
max-function-length Corpo da função excede o comprimento configurado apenas resumoQuebre a função em helpers menores.
unknown-repr Política `@repr(...)` desconhecida apenas resumoApenas `@repr(C)`, `@repr(packed)`, `@repr(transparent)` e `@repr(zolo)` são reconhecidos.
transparent-multi-field `@repr(transparent)` em struct com múltiplos campos apenas resumo`transparent` só se aplica a structs newtype com um único campo.
layout-in-default-repr `@layout(...)` em struct com repr padrão apenas resumo`@layout` só tem efeito junto com um `@repr` explícito.
align-not-positive `@layout(align = ...)` deve ser positivo apenas resumoAlinhamento deve ser uma potência de dois positiva.
align-not-power-of-two `@layout(align = ...)` deve ser potência de dois apenas resumoRegras de alinhamento de hardware exigem valores que sejam potência de dois (1, 2, 4, 8, ...).
align-too-large Valor de `@layout(align = ...)` muito grande apenas resumoO alinhamento solicitado excede o máximo suportado pela plataforma alvo.
size-not-positive `@layout(size = ...)` deve ser positivo apenas resumoO tamanho não pode ser zero nem negativo.
Parser · 6
P0001 String literal não terminada apenas resumoO lexer chegou ao fim do arquivo (ou da linha, em certos contextos) antes de encontrar a aspa de fechamento da string.
P0002 Token esperado O parser esperava um token específico (por exemplo `}`, `)`, identificador, tipo) mas encontrou outra coisa. Geralmente uma chave, parêntese ou pontuação ausente.
P0003 Token inesperado apenas resumoUm token apareceu onde a gramática não permite — tipicamente um símbolo perdido, palavra-chave digitada errada ou separador ausente na linha anterior.
P0004 Erro de parse genérico apenas resumoUm erro de parsing que não casou com nenhum classificador específico. Leia a mensagem do diagnóstico para a causa precisa.
P0005 Comentário HTML dentro de uma tag apenas resumoUm comentário `<!-- -->` foi escrito entre `<` e `>`, onde o próprio HTML também não permite. Dentro da tag, use os comentários de Zolo: `//` ou `/* */`. Nos filhos de um elemento, `<!-- -->` funciona normalmente.
TE139 Raw text element `<style>`/`<script>` sem fechamento `<style>` e `<script>` são raw text elements: o conteúdo corre verbatim até o `</style>`/`</script>` correspondente, sem markup aninhado e sem interpolação `{expr}`. Chegar ao fim do arquivo antes desse fechamento reporta TE139 em vez da mensagem genérica "unclosed element" — geralmente uma tag de fechamento esquecida, ou uma string no formato `</tag` dentro do conteúdo (por exemplo, um literal de string JS) que fechou o bloco cedo demais.
Tipos · 80
E0001 Incompatibilidade de tipos (legado) apenas resumoEquivalente a `TE001`. Emitido pelo classificador legado quando o novo typeck não anexou um código.
E0002 Variável indefinida (legado) apenas resumoAlias legado para `TE100`.
E0003 Função indefinida / não chamável (legado) apenas resumoAlias legado para `TE101`.
E0004 Não é possível reatribuir (legado) apenas resumoAlias legado para `TE004`. A variável foi declarada com `let`; use `let mut` para permitir reatribuição.
E0005 Campo indefinido (legado) apenas resumoAlias legado para `TE102`.
E0006 Campo ausente apenas resumoUm literal de struct omite um ou mais campos obrigatórios.
E0007 Número incorreto de argumentos (legado) apenas resumoAlias legado para `TE110`.
E0008 Tipo de retorno incompatível apenas resumoO valor retornado não corresponde ao tipo de retorno declarado pela função.
E0009 Declaração duplicada apenas resumoUm nome (função, variável, campo, variante) foi declarado duas vezes no mesmo escopo.
E0010 Tipo desconhecido apenas resumoUma anotação de tipo se refere a um tipo que o compilador não consegue encontrar.
TE001 Incompatibilidade de tipo em `let` O valor atribuído a um binding `let` não satisfaz a anotação de tipo declarada.
TE002 Incompatibilidade de tipo em `const` apenas resumoO valor atribuído a um binding `const` não satisfaz a anotação de tipo declarada.
TE003 Valor de `const` não é constante em tempo de compilação apenas resumo`const` exige uma expressão constant-foldable. Use `let` para valores de runtime.
TE004 Não é possível reatribuir um binding imutável Bindings `let` são imutáveis por padrão. Use `let mut x = ...` para permitir reatribuição, ou crie um novo binding com shadowing via `let`.
TE005 Atribuição composta em valor não numérico apenas resumoOperadores como `+=`, `-=`, `*=` exigem que ambos os lados sejam numéricos (ou strings, para `+=`).
TE006 Aridade de retorno múltiplo (faltam valores) apenas resumoA função declarou um retorno em tupla, mas a instrução `return` fornece menos valores.
TE007 Aridade de retorno múltiplo (excesso de valores) apenas resumoA função retorna mais valores do que seu tipo de retorno único pode comportar.
TE008 Tipo de elemento de array incompatível apenas resumoUm literal de array mistura tipos incompatíveis; arrays são homogêneos.
TE009 Aritmética entre tipos incompatíveis apenas resumoAritmética binária exige que ambos os operandos sejam numéricos e (em modo strict) do mesmo tipo numérico.
TE100 Variável indefinida O nome não está declarado em nenhum escopo envolvente. O compilador anexa uma sugestão "quis dizer?" quando existe um nome similar.
TE101 Chamando um valor que não é função apenas resumoO alvo de uma expressão de chamada não é um tipo invocável.
TE102 Struct não tem esse campo apenas resumoA struct não declara este campo. Sugestões "quis dizer?" são anexadas para nomes similares.
TE103 Nome de tipo desconhecido apenas resumoUma anotação de tipo ou campo de variante de enum se refere a um tipo que o compilador não consegue resolver.
TE104 Método inexistente O tipo receptor não tem um método com esse nome. Verifique a grafia, os imports e a visibilidade do trait.
TE105 Módulo da stdlib usado sem `use std::…` Um nome simples corresponde a um módulo conhecido da biblioteca padrão (`math`, `json`, `http`, `os`, …) que nunca foi trazido ao escopo. Diferente do TE100, o compilador reconhece o nome e diz exatamente qual linha `use` está faltando.
TE107 Campo faltando na construção do struct Um literal de struct omite um campo que não tem valor padrão nem zero-value de fallback. Todo campo sem default precisa ser fornecido explicitamente na construção.
TE108 Não é possível derivar `Default`: campo sem padrão Um struct com `@derive(Default)` tem um campo cujo tipo não possui zero-value nem default explícito, então nenhuma impl de `Default` pode ser sintetizada.
TE109 Não é possível inferir o tipo do campo pelo padrão Um campo de struct foi escrito sem anotação de tipo, contando com o valor padrão para inferi-lo (`nome = valor`) — mas o tipo do padrão é ambíguo (ex.: `nil`, ou uma expressão que resolve para `any`).
TE110 Aridade incorreta na chamada do método O número de argumentos passados não corresponde à quantidade de parâmetros da função.
TE111 Tipo de argumento incompatível em chamada de método O tipo de um argumento não corresponde ao tipo do parâmetro correspondente.
TE112 Campo embutido por `using` é ambíguo Dois ou mais campos embutidos com `using` declaram um campo de mesmo nome, então um acesso `.campo` no struct externo não sabe de qual embed promovê-lo.
TE113 Campo `using` precisa embutir um struct Um campo marcado com `using` precisa embutir outro struct — são os campos dele que são promovidos. Um escalar, ou qualquer tipo que não seja uma declaração de struct conhecida, não tem campos a promover.
TE114 Enum com discriminantes numéricos não pode ser genérico Um enum optou por discriminantes numéricos (tipo de backing, ou um `= n` explícito) mas é genérico ou tem variante com payload. Discriminantes só fazem sentido para enums planos, com todas as variantes unitárias.
TE115 Discriminante não cabe no tipo de backing O discriminante de uma variante está fora da faixa do tipo de backing declarado (`enum E: u8` limita a `0..=255`), então não sobreviveria ao ida-e-volta de `to_int()`/`from_int()`.
TE116 Valor de discriminante duplicado Duas variantes do mesmo enum resolveram para o mesmo inteiro — ou dois `= n` explícitos colidem, ou um valor auto-incrementado caiu em cima de um já usado.
TE117 Enum `@stable` exige discriminante explícito Sob `@stable` o auto-incremento é proibido: inserir uma variante no meio renumeraria silenciosamente todas as seguintes, quebrando a codificação que a anotação promete manter.
TE118 Discriminante precisa ser constante inteira O discriminante `= expr` de uma variante ou não avaliou para inteiro em tempo de compilação, ou não pôde ser avaliado como constante de compilação.
TE119 Enum `@flags` precisa ser plano e não-genérico Um enum `@flags` é genérico ou tem variante com payload. `@flags` modela uma bitmask sobre um conjunto fixo e plano de variantes unitárias — não há espaço para parâmetros de tipo ou payloads.
TE120 Valor de flag precisa ser potência de dois ou composto Cada variante `@flags` precisa ser um bit novo (auto-incrementado ou potência de dois explícita) ou um composto nomeado construído só a partir de bits declarados acima dela.
TE121 Valor de flag não cabe no tipo de backing O valor de uma flag está fora da faixa do tipo de backing do enum — flags em `enum: u8` param em `255` (bit 7).
TE122 Duas flags ocupam o mesmo bit Duas flags de bit único no mesmo enum `@flags` resolveram para o mesmo bit, normalmente porque receberam o mesmo valor explícito.
TE123 Campo inexistente no padrão de destructuring Um padrão de destructuring — `let Struct { … } = expr`, um `let { … }` anônimo, um padrão de parâmetro ou uma atribuição com destructuring de struct — nomeia um campo que o struct não tem.
TE124 Bloco `let … else` precisa divergir O bloco `else` pode cair para fora. Se caísse, a execução seguiria para os bindings do padrão com um valor que NÃO casou — por isso todo caminho pelo `else` precisa retornar, panicar, quebrar ou continuar.
TE125 Padrão refutável em `let` exige `else` O padrão pode não casar (padrão de variante de enum, padrão de tamanho de array, …) e não tem cláusula `else`. Sem ela, um valor que não casa ligaria lixo silenciosamente.
TE126 Não é possível inferir o struct por trás de `let { … }` Um padrão de struct anônimo precisa saber qual struct está desestruturando, mas o tipo do valor não resolve para um struct concreto — normalmente por falta de anotação de tipo.
TE127 Struct do padrão de parâmetro não bate com a anotação Um padrão de struct nomeado em posição de parâmetro (`fn f(NomeStruct { … }: T)`) nomeia um struct diferente da anotação de tipo do próprio parâmetro.
TE128 Origem do spread precisa ser struct ou record O spread final de um literal de struct (`Struct { ..origem }`) tem uma `origem` que não é struct nem record, então não há campos a espalhar.
TE129 Quantidade de valores incompatível na atribuição de tupla Uma atribuição com destructuring de tupla (`(a, b, c) = expr`) tem um número de alvos diferente do número de valores de `expr`.
TE130 Atribuição com destructuring só aceita `=` Operadores compostos (`+=`, `-=`, …) não têm significado por elemento quando o lado esquerdo é um padrão inteiro, e o spread `..` não faz sentido como alvo de atribuição.
TE131 Chamada com argumento nomeado não pode ser reordenada Um argumento nomeado (`f(nome: valor)`) não corresponde aos parâmetros declarados da função chamada — nome desconhecido ou duplicado, um argumento posicional depois de um nomeado, um parâmetro do meio pulado, ou uma chamada cuja assinatura não é conhecida localmente.
TE132 Placeholder `_` inválido O placeholder `_` só é válido como argumento direto na chamada do lado direito (RHS) de um estágio de pipe `|>`/`?>` (no máximo um por estágio), ou como a cabeça de uma cadeia de campo/método/índice usada como argumento de chamada (`_.campo`). Um `_` solto, um segundo `_` no mesmo estágio de pipe, ou `_` como lado esquerdo de um pipe são todos rejeitados.
TE133 Variante de enum desconhecida Um enum real e declarado foi identificado para este ponto — como base de `EnumName::variante`, ou como tipo do valor testado por um pattern com atalho `.variante` — mas o nome da variante não corresponde a nenhuma variante declarada. Uma sugestão "quis dizer?" é incluída na mensagem quando existe um nome próximo.
TE136 Não é possível inferir o enum de um atalho `.Variante` O atalho `.Variante` descobre seu enum a partir do tipo esperado pela posição onde aparece, e esta posição não fornece nada utilizável — nenhum tipo esperado (um `let` sem anotação, um argumento de uma função cuja assinatura não é conhecida), um parâmetro genérico ainda não fixado, ou um tipo que não é um enum. Anote a variável ou escreva a forma qualificada `Enum::Variante`.
TE137 Variante desconhecida em um atalho `.Variante` O atalho `.Variante` resolveu seu enum a partir do tipo esperado pela posição, mas esse enum não tem nenhuma variante com esse nome. Uma sugestão "quis dizer?" é incluída quando existe um nome próximo. A forma de pattern do mesmo erro reporta `TE133` em vez deste código.
TE134 Nome do prelúdio da VM não tem implementação nativa O nome faz parte do prelúdio sempre-em-escopo da VM, mas o backend native/LLVM não tem implementação para ele. Compilar assim mesmo faria o nome virar `nil` silenciosamente e sair com 0 — por isso o build falha.
TE135 Nome desconhecido não tem binding nativo Check exclusivo de native/LLVM: um identificador simples não resolveu para nada. Sem prelúdio Lua de fallback, ele viraria `nil` silenciosamente em runtime — a classe "typo vira no-op quieto" que isso pega em tempo de build.
TE201 Modo strict: variável precisa de anotação apenas resumoA tipagem strict exige que todo `let`/`const` tenha uma anotação de tipo explícita.
TE202 Modo strict: parâmetro precisa de anotação apenas resumoA tipagem strict exige que todo parâmetro de função tenha um tipo explícito.
TE301 Quantidade incorreta de argumentos de tipo genérico apenas resumoO número de argumentos de tipo fornecidos não corresponde à quantidade de parâmetros do tipo genérico.
TE302 Trait desconhecido apenas resumoUm bound de trait, bloco `impl` ou cláusula `where` faz referência a um trait que o compilador não encontra.
TE730 Interpolação `@()` fora de valor de declaração `@(expr)` compila para uma ponte de custom property de CSS (`var(--…)`), que só existe em valores de declaração — depois do `:`, antes do `;`. Em seletor, nome de propriedade ou prelúdio de at-rule não há `var()` para a ponte compilar, e splice de texto do usuário ali é anti-feature deliberada. Mova a parte dinâmica para um valor, ou alterne classes estáticas no markup.
TE731 `children` de runtime em `<style>` exige `global` Um `<style children={expr}>` carrega conteúdo de runtime que o compilador não enxerga — não dá para içar nem escopar; escopar texto desconhecido seria mentira. Spec §6.1: conteúdo dinâmico precisa optar por `global` explicitamente (`<style global children={…}>`), a única forma de style que continua sendo nó de render.
TE732 Valor de interpolação CSS com tipo não serializável Um valor de `@()` viaja como custom property de CSS, e só `str`, `int` e `float` serializam para uma. Valor tipado `bool`, `View`, map, struct ou função é rejeitado em compilação — no render viraria lixo ou sumiria. Valores sem tipo (`Any`) ficam em silêncio: este erro nunca chuta.
TE733 `@()` colado em texto adjacente do valor CSS `@()` compila para `var(--…)`, e CSS não concatena strings em valores comuns — `var(--w)px` é erro de sintaxe que o browser descarta, não "número mais unidade". Escreva `calc(@(x) * 1px)` ou interpole a string inteira (`@(f"{x}px")` — dentro de `@()` você está de volta em Zolo). `!important`, `/` e `*` em `calc()` são vizinhos sem espaço legais.
TE734 `:global()` malformado — vazio ou aninhado `:global(…)` isenta um compound do carimbo de escopo hermético. Um wrapper vazio (`:global()`) não isenta nada, e um aninhado (`:global(:global(a))`) escapa de um escape — os dois só podem ser engano. Num corpo `<style global>`, `:global()` nem é sintaxe Zolo e passa intacto.
TE735 Seletor escopado não casa com nenhum elemento do componente Aviso, nunca falha de build. O escopo hermético carimba cada compound com a classe do componente, então um seletor que nomeia classe/id/tag que o markup do próprio componente nunca produz é regra morta — e `:root` sob escopo é estruturalmente morto. Vem com "quis dizer?" (distância de edição ≤ 2) e o conjunto renderizado do componente. Valores dinâmicos de class/id ou chamadas `el`/`raw` abrem o conjunto e suprimem o aviso — ele nunca chuta.
TE736 `<style>` fora de componente não tem escopo Um `<style>` escopado pertence ao fn de componente que o cerca — o carimbo de classe do fn é o escopo dos seletores. Em statement top-level ou método de `impl`/`trait` não há componente, logo não há escopo. Adicione `global` (um `<style global>` estático fora de componente renderiza no lugar) ou mova para um fn de componente. Corpo com `@()` reporta isso mesmo com `global`: os valores precisam de um elemento-raiz de componente.
TE737 `@()` precisa de um elemento-raiz para carregar o valor Todo valor de `@()` viaja como custom property de CSS no elemento-raiz do componente (o literal de elemento em posição de cauda), herdando DOM abaixo. Um componente que delega a view inteira — sem raiz de elemento própria — não dá onde os valores andarem. Faça a cauda ser um literal de elemento (um `<div>` de embrulho serve) ou remova a interpolação.
TE738 Propriedade CSS desconhecida Aviso, nunca falha de build. Nomes de propriedade são checados contra uma tabela curada que vem com a toolchain (dado estático, sem download de registry); um quase-acerto volta com "quis dizer?" (distância de edição ≤ 2). Nomes começando com `-` — prefixos de vendor e custom properties `--` — nunca são checados, nem descritores de at-rule (o `src` de `@font-face`, …). Propriedade mais nova que a tabela custa um sublinhado, nunca um release.
TE820 Tipo não implementa um trait exigido Uma função genérica foi chamada com um argumento de tipo que não implementa um trait exigido por um de seus bounds.
TE821 Operador exige trait bound no parâmetro de tipo Um operador é usado sobre um parâmetro de tipo genérico que não carrega o trait bound correspondente. Sem ele, o compilador não garante que a operação vale para todo argumento de tipo possível.
TE822 Trait não existe Um bound na assinatura da função nomeia um trait que o compilador não conhece.
TE823 Operador exige que o tipo concreto implemente um trait Um operador é usado sobre um valor de struct/enum concreto cujo tipo não implementa o trait exigido. Sem ele não há método para dirigir o operador, e quebraria em runtime.
TE824 Caminho qualificado de trait inválido Caminhos qualificados de trait precisam ser `core::<módulo>::<Trait>` ou `std::<módulo>::<Trait>`, nomeando um `pub trait` realmente declarado ali — tanto em bound genérico quanto em cabeçalho de `impl`.
TE825 Impl de trait incompleta: método obrigatório faltando Um `impl Trait for Tipo` está sem um ou mais métodos obrigatórios (os que não têm corpo padrão). Sem eles, o despacho de método e operador quebraria em runtime.
TE826 Método de coleção em `Result`/`Option` não desembrulhado Um método de coleção (`each`, `filter`, `len`, …) foi chamado diretamente sobre um wrapper `Result` ou `Option`. Desembrulhe-o primeiro com `?>`, `?` ou `.unwrap()`.
TE827 Encadeamento null-safe `?.` em `Result`/`Option` `?.` é encadeamento null-safe, não desembrulhamento falível. Um `Result` ou `Option` nunca é `nil`, então o encadeamento opera sobre o wrapper. Use `expr ?> .m(...)`, `let v = expr?` ou `expr!.m(...)` em vez disso.
TE828 Tipo não é iterável `for x in expr` exige que `expr` produza uma sequência. Zolo itera coleções nativas e qualquer tipo que implemente `Iterator`/`IntoIterator`; um struct ou enum que não implementa nenhum dos dois não dá nada ao laço.
TE970 Tagged template sem função de tag correspondente Um tagged template `tag"…"` não é sintaxe especial — ele se reduz a uma chamada comum a uma função chamada `tag`, e nenhuma função com esse nome está em escopo.
TE976 Statement que não é expressão dentro de `parallel { }` `parallel { … }` roda cada statement de topo como sua própria task concorrente, então todo statement do bloco precisa ser uma expressão que possa virar uma.
Efeitos · 15
TE800 Declaração de efeito ausente apenas resumoUma função executa um efeito (`!io`, `!net`, `!fs`, ...) que não declarou em sua assinatura.
TE801 Efeito não tratado apenas resumoUm efeito foi executado mas nenhum bloco `handle` envolvente o trata.
TE802 Efeito não declarado pelo handler apenas resumoUm bloco `handle` tenta tratar uma operação que o efeito não declarou.
TE803 Operação ausente no handler apenas resumoUm bloco `handle` está sem a implementação de uma das operações declaradas pelo efeito.
TE804 Operação desconhecida no handler apenas resumoO handler referencia um nome de operação que não existe no efeito.
TE805 Efeito desconhecido apenas resumoUma assinatura de função ou handler faz referência a um efeito que o compilador não encontra.
TE806 Aridade / assinatura de efeito incompatível apenas resumoUma chamada `perform` ou operação de handler não corresponde à assinatura declarada do efeito.
TE807 Cobertura do handler-valor está incompleta `handle … with <handler_valor>` usa um handler-valor que cobre só parte das operações do efeito. O erro aparece no `with` e nomeia as operações faltantes.
TE808 Tipo de argumento incompatível no `perform` Uma chamada `perform Efeito::op(…)` passou um argumento cujo tipo não corresponde ao tipo do parâmetro declarado da operação.
TE809 Função realiza efeitos que não declara A forma resumida do TE800: em vez de reportar cada `perform`, junta todos os efeitos que a função de fronteira realmente precisa e reporta todos na assinatura.
TE810 Handler cobre um efeito que o corpo nunca realiza É um aviso, não uma falha de build. Um bloco `handle` usando um handler-valor com anotação explícita `handler<…>` cobre um efeito que o corpo tratado nunca realiza.
TE811 Parâmetro genérico usado como tipo e como variável de linha Um parâmetro genérico é usado tanto como parâmetro de tipo quanto como cauda de variável de linha numa cláusula `with` (`{Fs | e}`). Um mesmo nome não pode significar um tipo e um conjunto de efeitos extras ao mesmo tempo.
TE812 Efeito multi-shot não é suportado no backend nativo Um `perform` mira uma operação declarada `multi` (retomável mais de uma vez). Continuações multi-shot hoje são exclusivas da VM.
TE813 Não é possível inferir argumento de tipo da operação de efeito O parâmetro de tipo de um efeito genérico não resolveu num `perform` — nem os tipos dos argumentos nem um `with Efeito<Concreto>` deram um tipo concreto.
TE814 `handle … with h` exige um handler-valor `h` precisa ser algo cujo tipo seja `handler<…>`. Se resolver para outra coisa, não há conjunto de braços para despachar as operações realizadas.