TS8099
Front-end code UNSUPPORTED
UNSUPPORTED (TS8099) is the one deliberate exception to "sequential": it is the catch-all for a diagnostic whose site does not yet deserve its own code, so it stays parked past the sequential range instead of at its head.
The registry text and every compiler message on these pages are the compiler's own English.
Example
"use typeshade"
@fragmentexport function main(@location(0) uv: vec2): vec4 { let g = 0. do { g += 0.5 } while (g < 1.) return vec4(g, g, g, 1.)}Compiled at build time against the pinned compiler, this program gets:
TS8099 error, line 6: do…while is not supported: the IR has one loop shape, a top-tested "for", and a do…while runs its body before the first test. Write "while (c) { … }" with the body's first pass unrolled above it, or a counted "for".
How to fix it
The same program, corrected. It compiles with no diagnostic.
"use typeshade"
@fragmentexport function main(@location(0) uv: vec2): vec4 { let g = 0.5 while (g < 1.) { g += 0.5 } return vec4(g, g, g, 1.)}The rules this enforces
- Rule 6.1 Test
- A resource must be written
declare const x: uniform<T>,declare const x: storage<T>,declare const x: storage<T, "read_write">, ordeclare const x: <texture or sampler type>. - Rule 6.2 Test
- A storage binding’s access mode is its second type argument:
storage<T>isvar<storage, read>andstorage<T, "read_write">isvar<storage, read_write>. - Rule 7.7 Test
discardmust be written as a bare statement, the identifier alone (discard), and may stand in a fragment entry and in a helper no vertex or compute entry can reach.- Rule 8.3 Test
- A builtin WGSL confines by stage may be used in an entry of a permitted stage, and in a helper that no entry of an excluded stage can reach.
- Rule 8.6 Test
- An entry point must not be called from another function, and neither may a kernel function (Rule 8.22).
- Rule 8.17 Test
- A local function (a
constthat holds an arrow function or a function expression, or afunctiondeclaration, written inside a function’s body) is a function of the module named after the body that declares it (surface §14), and it may read and write the variables of the functions around it, as a TypeScript closure does. - Rule 8.18 Test
- A function whose parameter has a function type, written out (
f: (x: f32) => f32) or through a type alias of one, takes a function: a function declared at the top of the file or of a namespace, a method, a static method, a constructor, a field that holds a function (Rule 8.16) and a local function (Rule 8.17).
See also
-
SD0109 - a fragment-only builtin is reachable from a vertex or compute entry
Source
Where the compiler raises this code at commit 26de7be8, one line per file:
-
src/compiler/ts/bindings.ts:158(2 sites) -
src/compiler/ts/lower/array-methods.ts:203(6 sites) -
src/compiler/ts/lower/atomics.ts:70 -
src/compiler/ts/lower/control.ts:61(2 sites) -
src/compiler/ts/lower/expression-array.ts:159(2 sites) -
src/compiler/ts/lower/expression-call.ts:219(10 sites) -
src/compiler/ts/lower/expression-misc.ts:164(2 sites) -
src/compiler/ts/lower/expression-prop.ts:180(6 sites) -
src/compiler/ts/lower/expression.ts:197(10 sites) -
src/compiler/ts/lower/function-args.ts:120(2 sites) -
src/compiler/ts/lower/function.ts:1276(2 sites) -
src/compiler/ts/lower/runtime-array.ts:95 -
src/compiler/ts/lower/statement.ts:277(18 sites) -
src/compiler/ts/mixins.ts:33 -
src/compiler/ts/module.ts:120 -
src/language-service/check.ts:140 -
src/language-service/diagnostics.ts:2227