Compiler diagnostics
This page is the source-of-truth catalog for Raven compiler diagnostics and links to runnable samples where relevant.
For configurable guidance reported by the analyzers bundled with Raven, see Built-in analyzers. Compiler diagnostics define language validity; analyzer diagnostics define project-selectable policy.
How to inspect diagnostics from a sample
From samples/:
dotnet run --project ../src/Raven.Compiler --property WarningLevel=0 -- <sample.rav> --no-emit
Useful sample entry points:
samples/control-flow/throw-expression-basic.ravfortry/catch/throwdiagnostics.samples/functions/return-expression-basic.ravfor expression-context control-flow diagnostics.samples/unmanaged/pointers.ravfor unsafe/pointer diagnostics.samples/async/async-await.ravandsamples/async/async-task-return.ravfor async/await diagnostics.samples/patterns/match-expression.ravandsamples/patterns/*for match/pattern diagnostics.
Return/throw context note:
RAV1900andRAV1907apply to inline expression contexts.- Explicit
return <value>andthrowstatements are valid in statement contexts (including statement-formmatcharms and supported block-expression early-exit regions).
In-source suppression
Diagnostics can also be suppressed directly in source with comment-based pragmas:
#pragma warning disable RAV0103
missing
#pragma warning restore RAV0103
Use disable/restore without IDs to suppress or restore all diagnostics. disable-next-line suppresses only the next line. // pragma warning ... is also accepted.
Diagnostics catalog
| ID | Severity | Title | Message template | Related samples |
|---|---|---|---|---|
RAV0021 |
Error | Not indexable | Not indexable | — |
RAV0023 |
Error | Operator not supported | '{operatorToken}' is not supported for '{operandType}'. | — |
RAV0024 |
Error | Operator not supported | '{operatorToken}' is not supported for '{operandType1}' and '{operandType2}'. | — |
RAV0027 |
Error | Value is read-only | Value is read-only | — |
RAV0030 |
Error | Not callable | Invalid invocation expression. | — |
RAV0103 |
Error | Name not found | '{name}' is not in scope. | — |
RAV0111 |
Error | Member already defined | Type '{typeName}' already defines a member called '{memberName}' with the same parameter types | — |
RAV0112 |
Error | Function already defined | A function named '{name}' is already defined with the same parameter types | — |
RAV0117 |
Error | Member not found | '{container}' has no member '{member}'. | — |
RAV0118 |
Error | Value used as a type | '{name}' is a value, not a type. | — |
RAV0119 |
Error | Namespace used as a type | '{name}' is a namespace, not a type. | — |
RAV0121 |
Error | Ambiguous call | This call matches both '{method1}' and '{method2}'. | — |
RAV0131 |
Error | Assignment target must be settable | Assignment target must be settable | — |
RAV0132 |
Error | Type cannot be deconstructed | '{typeName}' does not support positional deconstruction. | — |
RAV0133 |
Error | Deconstruction count mismatch | Expected {expectedCount} element(s) but found {actualCount}. | — |
RAV0134 |
Error | Discard is not a value | '_' cannot be used as a value. | — |
RAV0135 |
Error | Assignment is statement-only | Assignments can only appear as statements. | — |
RAV0149 |
Error | Method name expected | Method name expected | — |
RAV0162 |
Warning | Unreachable code | Unreachable code | — |
RAV0166 |
Error | Missing initializer | '{name}' must be initialized. | — |
RAV0167 |
Error | Variable already defined | '{name}' is already defined in this scope. | — |
RAV0168 |
Warning | Variable shadows earlier name | '{name}' shadows a previous declaration. | — |
RAV0169 |
Error | Const needs a constant value | '{name}' must be initialized with a compile-time constant. | — |
RAV0170 |
Error | Const local initializer cannot be converted | The value for '{name}' cannot be converted to '{typeName}'. | — |
RAV0171 |
Error | Const field requires a constant initializer | '{name}' must be initialized with a compile-time constant. | — |
RAV0172 |
Error | Const field initializer cannot be converted | The value for '{name}' cannot be converted to '{typeName}'. | — |
RAV0173 |
Error | Const field requires an initializer | '{name}' must have an initializer. | — |
RAV0174 |
Error | Use before declaration | '{name}' is used before it is declared. | — |
RAV0176 |
Error | External constant requires a value | External constant '{name}' requires a value. | — |
RAV0177 |
Error | External constant value cannot be converted | Value '{value}' cannot be converted to '{typeName}' for external constant '{name}'. | — |
RAV0178 |
Error | External constant requires an explicit type | External constant '{name}' must declare a type. | — |
RAV0179 |
Info | External constant initializer is overridden | External constant '{name}' uses a build-supplied value instead of its source initializer. | — |
RAV0191 |
Error | A readonly field cannot be assigned to (except in a constructor or a variable initializer) | A readonly field cannot be assigned to (except in a constructor or a variable initializer) | — |
RAV0200 |
Error | '{name}' is read-only and cannot be assigned to. | '{name}' is read-only and cannot be assigned to. | — |
RAV0201 |
Error | Event can only be used with '+=' or '-=' | The event '{name}' can only appear on the left hand side of '+=' or '-=' | samples/oop/event-basic.rav |
RAV0202 |
Error | Event cannot be invoked | The event '{name}' cannot be invoked because it does not declare a backing field | samples/oop/event-basic.rav |
RAV0234 |
Error | Type or namespace does not exist in namespace | '{typeOrNs}' was not found in '{container}'. | — |
RAV0235 |
Error | Type expected without wildcard | Expected a type name (wildcards are not allowed here). | — |
RAV0240 |
Error | Type does not support with-expressions | The type '{typeName}' does not support 'with' expressions | samples/oop/with-expression-record-basic.rav, samples/oop/with-expression-record-advanced.rav |
RAV0241 |
Error | With-expression assigns a member multiple times | The member '{memberName}' is assigned more than once in the with-expression | samples/oop/with-expression-record-basic.rav, samples/oop/with-expression-record-advanced.rav |
RAV0269 |
Error | Unassigned out parameter | Use of unassigned out parameter '{parameterName}' | — |
RAV0305 |
Error | Type requires type arguments | The type '{name}' requires {arity} type argument(s) | — |
RAV0306 |
Error | Cannot inherit from sealed type | Type '{typeName}' is sealed and cannot be inherited | — |
RAV0307 |
Error | No virtual member to override | '{memberName}': no suitable {memberType} found to override | — |
RAV0308 |
Error | Virtual member in sealed type | Member '{memberName}' cannot be virtual because the containing type '{typeName}' is sealed | — |
RAV0309 |
Error | 'final' modifier requires override | Member '{memberName}' cannot be marked 'final' because it is not an override | — |
RAV0310 |
Error | Cannot override final member | Member '{memberName}' cannot override final member '{overriddenMemberName}' | — |
RAV0311 |
Error | Static members cannot be virtual or override | Static member '{memberName}' cannot be marked '{modifier}' | — |
RAV0312 |
Error | Static constructors cannot specify a base initializer | Static constructors cannot specify a base constructor initializer | — |
RAV0313 |
Error | Explicit interface specifier must name an interface | Explicit interface specifier must name an interface type | — |
RAV0314 |
Error | Type does not implement interface | Type '{typeName}' does not implement interface '{interfaceName}' | — |
RAV0315 |
Error | Explicit interface member not found | Interface '{interfaceName}' does not contain a member named '{memberName}' matching this signature | — |
RAV0316 |
Error | Optional parameter default value cannot be converted | The default value for optional parameter '{parameterName}' cannot be converted to type '{parameterType}' | — |
RAV0317 |
Error | Optional parameters must be trailing | Optional parameter '{parameterName}' must be the last parameter in the list | — |
RAV0318 |
Error | Default value must be a compile-time constant | Default value for parameter '{parameterName}' must be a compile-time constant | — |
RAV0319 |
Error | Default value cannot convert to parameter type | Default value for parameter '{parameterName}' cannot be converted to '{parameterType}' | — |
RAV0320 |
Error | Type argument does not satisfy constraint | The type '{typeArgument}' must satisfy the '{constraint}' constraint for type parameter '{typeParameter}' of '{genericName}' | — |
RAV0321 |
Error | Operator must be static | Operator '{operatorToken}' must be declared static | — |
RAV0322 |
Error | Operator must be public | Operator '{operatorToken}' must be declared public | — |
RAV0323 |
Error | Operator parameter count is invalid | Operator '{operatorToken}' requires {expectedParameterDescription} parameter(s) | — |
RAV0324 |
Error | Extension operators are not supported | Operator '{operatorToken}' overloads are not supported in extensions | — |
RAV0325 |
Error | Operator declaration must be in class or struct | Operator '{operatorToken}' declarations are only supported in classes and structs | — |
RAV0326 |
Error | Invalid modifier combination | Member '{memberName}' cannot be marked both '{modifier1}' and '{modifier2}' | — |
RAV0327 |
Error | Static class cannot declare instance members | Static class '{typeName}' cannot declare instance member '{memberName}' | — |
RAV0328 |
Error | Static type cannot be inherited | Type '{typeName}' is static and cannot be inherited | — |
RAV0329 |
Error | Static type cannot be instantiated | Type '{typeName}' is static and cannot be instantiated | — |
RAV0330 |
Error | Type does not implement abstract member | Type '{typeName}' does not implement abstract member '{memberName}' from base type '{baseTypeName}' | — |
RAV0331 |
Warning | Member hides inherited member | Member '{memberName}' hides inherited member '{hiddenMemberName}'. Add the 'new' modifier if hiding was intended. | — |
RAV0332 |
Error | Modifier not valid on member | Modifier '{modifier}' is not valid on {memberKind} '{memberName}' | — |
RAV0333 |
Warning | Redundant open modifier on abstract class | Modifier 'open' is redundant on abstract class '{typeName}' | — |
RAV0340 |
Warning | Redundant abstract modifier on sealed class | Modifier 'abstract' is redundant on sealed class '{typeName}' | — |
RAV0345 |
Error | Record instance storage must come from primary constructor parameters | Record '{recordName}' cannot declare instance {memberKind} '{memberName}'; record instance data must come only from primary constructor parameters. | — |
RAV0346 |
Error | Records cannot declare secondary constructors | Record '{recordName}' cannot declare instance constructors; use the primary constructor and static factory methods. | — |
RAV0400 |
Error | Nullable type not allowed in union | Nullable types are not allowed in union types | samples/nullability/nullable-reference-option-conversion-basic.rav, samples/nullability/nullable-value-option-conversion-basic.rav |
RAV0401 |
Error | Type parameter cannot be nullable | Type parameter '{typeParameter}' has a 'notnull' constraint and cannot be made nullable | samples/nullability/nullable-reference-option-conversion-basic.rav, samples/nullability/nullable-value-option-conversion-basic.rav |
RAV0402 |
Error | Nullable value must be unwrapped | A member cannot be accessed through nullable type '{receiverType}'; unwrap or pattern-bind the value first | Static type error. See Nullability and absence. |
RAV0403 |
Warning | Nullable suppression used | The '!' operator treats the operand as non-null | Reported on the full <expr>! nullable suppression expression. |
RAV0404 |
Error | Conditional access requires nullable receiver | Conditional access requires a nullable receiver; '{receiverType}' is not nullable | — |
RAV0405 |
Error | Struct union argument may be default | Struct union argument for parameter '{parameterName}' of type '{unionType}' may be the inactive default state | — |
RAV0406 |
Error | Struct union return value may be default | Struct union return value of type '{unionType}' may be the inactive default state | — |
RAV0410 |
Error | Enum underlying type list must be a single type | Enum declarations may specify only one underlying type | samples/oop/enum-basic.rav, samples/oop/enum-explicit-values-basic.rav |
RAV0411 |
Error | Enum underlying type must be integral | Enum underlying type must be a non-nullable integral type; '{typeName}' is not valid | samples/oop/enum-basic.rav, samples/oop/enum-explicit-values-basic.rav |
RAV0412 |
Error | Enum member value must be constant | Enum member '{name}' must be initialized with a constant expression | samples/oop/enum-basic.rav, samples/oop/enum-explicit-values-basic.rav |
RAV0413 |
Error | Enum member value cannot be converted | Enum member '{name}' value cannot be converted to '{typeName}' | samples/oop/enum-basic.rav, samples/oop/enum-explicit-values-basic.rav |
RAV0426 |
Error | Type name does not exist in type | The type name '{name}' does not exist in the type '{container}' | — |
RAV0500 |
Error | Symbol is inaccessible | The {symbolKind} '{name}' is inaccessible due to its visibility | — |
RAV0501 |
Error | Type is less accessible than member | The {typeRole} type '{typeName}' is less accessible than {memberKind} '{memberName}' | — |
RAV0502 |
Error | Attribute not valid for target | Attribute '{attributeName}' is not valid on target '{targetName}'. Valid targets are '{validTargets}' | — |
RAV0503 |
Error | Attribute does not allow multiple | Attribute '{attributeName}' cannot be applied multiple times to the same '{targetName}' | — |
RAV0504 |
Error | Attribute argument must be constant | Attribute argument must be a constant expression | — |
RAV0505 |
Warning | Obsolete member usage | The {symbolKind} '{memberName}' is obsolete: {message} | — |
RAV0600 |
Error | Type already defined | A type named '{name}' is already defined in this scope | — |
RAV0601 |
Error | 'partial' modifier missing | Type '{name}' has multiple declarations; all declarations must include the 'partial' modifier | — |
RAV0602 |
Error | Partial type accessibility mismatch | All partial declarations of type '{name}' must declare the same accessibility | — |
RAV0603 |
Error | Partial type type parameters must match | All partial declarations of type '{name}' must declare the same type parameters in the same order | — |
RAV0604 |
Error | Partial method is missing implementation | Partial method '{name}' must have an implementation part | — |
RAV0605 |
Error | Partial method is missing declaration | Partial method '{name}' must have a declaration part without a body | — |
RAV0606 |
Error | Partial method requires partial type | Partial method '{name}' must be declared inside a partial type | — |
RAV0607 |
Error | Partial property is missing implementation | Partial property '{name}' must have an implementation part | — |
RAV0608 |
Error | Abstract member cannot have a body | '{memberName}' cannot declare a body because it is marked abstract | — |
RAV0609 |
Error | Partial property is missing declaration | Partial property '{name}' must have a declaration part without accessor bodies | — |
RAV0610 |
Error | Abstract member declared in non-abstract type | '{memberName}' is abstract but is contained in non-abstract type '{typeName}' | — |
RAV0611 |
Error | Cannot instantiate abstract type | Type '{typeName}' is abstract and cannot be instantiated | — |
RAV0612 |
Error | Partial property requires partial type | Partial property '{name}' must be declared inside a partial type | — |
RAV0613 |
Error | Partial property implementation cannot be auto | Partial property '{name}' implementation must provide at least one accessor body | — |
RAV0614 |
Error | Partial event is missing implementation | Partial event '{name}' must have an implementation part | — |
RAV0615 |
Error | Partial event is missing declaration | Partial event '{name}' must have a declaration part without accessor bodies | — |
RAV0616 |
Error | Partial event requires partial type | Partial event '{name}' must be declared inside a partial type | — |
RAV0617 |
Error | Partial event implementation cannot be field-like | Partial event '{name}' implementation must provide at least one accessor body | — |
RAV0815 |
Error | Cannot assign void to an implicitly-typed variable | Cannot assign void to an implicitly-typed variable | — |
RAV0905 |
Error | Required member must be set | Required member '{memberName}' must be set | samples/oop/required-members-basic.rav |
RAV0906 |
Error | Required field must be mutable | Required field '{fieldName}' must be mutable | samples/oop/required-members-basic.rav |
RAV0908 |
Warning | Redundant public modifier | Modifier 'public' is redundant because type members are public by default. | — |
RAV0909 |
Error | Method declaration missing func keyword | Method declaration '{methodName}' must include the 'func' keyword. | — |
RAV0910 |
Warning | val property set accessor must be restricted | Property '{propertyName}' is declared 'val' and its '{accessorKind}' accessor must be less accessible than the getter. | — |
RAV0911 |
Warning | var property requires writable shape | Property '{propertyName}' is declared 'var' but has no writable shape. Add a 'set'/'init' accessor or a storage initializer. | — |
RAV0912 |
Error | field keyword is only valid in property accessors | 'field' is only valid inside property 'get', 'set', or 'init' accessor bodies. | — |
RAV0913 |
Error | field keyword requires property backing storage | Property '{propertyName}' does not have backing storage, so 'field' cannot be used here. | — |
RAV0914 |
Error | Property declaration requires a binding keyword | Property '{propertyName}' requires an explicit binding keyword ('val' or 'var'). | — |
RAV0918 |
Error | Property type annotation required | Property '{propertyName}' requires an explicit type annotation unless it has a storage initializer. | — |
RAV1000 |
Error | Expression expected | Expression expected | — |
RAV1001 |
Error | Identifier expected | Identifier expected | — |
RAV1002 |
Error | Semicolon expected | ';' expected | — |
RAV1003 |
Error | Character expected | '{character}' expected | — |
RAV1004 |
Error | Duplicate modifier | Duplicate '{modifier}' modifier | — |
RAV1005 |
Error | Import directives must come first | 'import' directives must appear before 'alias' and declarations. | — |
RAV1006 |
Error | Alias directive out of order | Alias directives must appear before member declarations | — |
RAV1007 |
Error | Field declaration requires a binding keyword | Field declarations must start with 'field' or 'const' | — |
RAV1008 |
Error | Duplicate named argument | Named argument '{name}' specified multiple times | — |
RAV1009 |
Error | Unrecognized escape sequence | Unrecognized escape sequence | — |
RAV1010 |
Error | Newline in constant | Newline in constant | — |
RAV1012 |
Error | File-scope code requires console application | Only console applications may contain file-scope code | — |
RAV1013 |
Error | File-scope code may only appear in one file | File-scope code may only appear in one file | — |
RAV1014 |
Error | Console application requires entry point | Entry point 'Main' not found | — |
RAV1015 |
Error | try statement requires catch or finally | A try statement must include at least one catch clause or a finally clause | samples/control-flow/throw-expression-basic.rav, samples/control-flow/try-catch-basic.rav |
RAV1016 |
Error | Catch type must derive from System.Exception | Type '{typeName}' is not derived from System.Exception | samples/control-flow/throw-expression-basic.rav, samples/control-flow/try-catch-basic.rav |
RAV1017 |
Error | Program has more than one entry point defined | Program has more than one entry point defined | — |
RAV1018 |
Error | File-scoped namespace out of order | File-scoped namespace declarations must appear before any other members | — |
RAV1019 |
Error | End the statement with a newline or ';'. | End the statement with a newline or ';'. | — |
RAV1020 |
Error | Thrown expression must be an exception type | Expression of type '{typeName}' cannot be thrown because it does not derive from System.Exception | samples/control-flow/throw-expression-basic.rav, samples/control-flow/try-catch-basic.rav |
RAV1021 |
Error | Top-level statements not allowed with top-level Main | Top-level statements are not allowed when 'Main' is declared as a top-level function | — |
RAV1022 |
Error | Invalid entry point signature | Entry point 'Main' must be static and return 'void', 'int', 'Unit', 'Task', 'Task |
— |
RAV1023 |
Error | Expected newline between declarations | Expected newline between declarations. | — |
RAV1024 |
Error | Catch pattern must be an exception type pattern | Catch pattern '{patternKind}' is not supported here. Use an exception type pattern such as 'Exception ex'. | — |
RAV1026 |
Warning | List separators are inconsistent | Use either commas or newlines consistently to separate items in this list. | — |
RAV1050 |
Error | Public extension requires an identifier | Public extension declarations must have an explicit identifier | samples/extensions/extension-methods-basic.rav, samples/extensions/static-extensions.rav |
RAV1501 |
Error | No overload for method taking argument | No overload for {type} '{name}' takes {count} arguments | — |
RAV1503 |
Error | Cannot convert from type to type | Cannot convert from '{fromType}' to '{toType}' | — |
RAV1504 |
Error | Cannot assign to type | Cannot assign {fromType} to {toType} | — |
RAV1505 |
Error | Multiple content entries not allowed | Type '{typeName}' has a settable 'Content' property; only one content entry is allowed in an initializer | — |
RAV1506 |
Info | Result propagation applies implicit error conversion | Result propagation converts errors from '{fromType}' to '{toType}' via implicit conversion '{conversion}'. | — |
RAV1525 |
Error | Invalid expression term | Invalid expression term '{tokenText}' | — |
RAV1602 |
Error | Property not found in property pattern | Property '{name}' does not exist on type '{type}' | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1603 |
Error | Property pattern type mismatch | Type '{inputType}' cannot be matched against property pattern type '{patternType}' | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1604 |
Error | Property pattern requires a type | Property pattern requires an explicit type here because it cannot be inferred from the input | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1605 |
Error | Relational pattern not supported for type | Relational pattern operator '{operatorToken}' is not supported for type '{typeName}' | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1606 |
Error | Relational pattern value cannot be converted | Relational pattern value of type '{valueType}' cannot be converted to '{inputType}' | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1607 |
Error | Pattern binding requires a binding keyword | Pattern binding '{name}: {typeName}' requires an explicit binding keyword ('let', 'var', or 'val'). | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1608 |
Info | Bind a new value using 'let' or 'var' | If you meant to bind a new value in this pattern, use 'let {name}' (or 'var {name}'). | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1610 |
Error | Nominal deconstruction pattern requires a deconstructable type | Nominal deconstruction pattern requires a deconstructable type; '{type}' does not support deconstruction | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1611 |
Error | Nominal deconstruction pattern type mismatch | Type '{inputType}' cannot be matched against nominal deconstruction pattern type '{patternType}' | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1612 |
Error | Nominal deconstruction pattern argument count mismatch | Type '{recordType}' expects {expected} deconstruction argument(s) but received {actual} | samples/patterns/property-pattern-basic.rav, samples/patterns/record-pattern-basic.rav, samples/tuples/tuple-pattern-match-basic.rav |
RAV1616 |
Error | Let-else clause must exit | The else clause of a let-else statement must not complete normally | samples/patterns/let-else-basic.rav, samples/nullability/nullable-let-else-basic.rav |
RAV1900 |
Error | Return statement not allowed here | Return statements are not valid in expressions; use an implicit return instead | samples/functions/return-expression-basic.rav |
RAV1901 |
Error | If expression requires an else clause | If expressions used as values must include an else clause | samples/functions/return-expression-basic.rav |
RAV1902 |
Error | Break statement not allowed here | Break statements are not valid in expressions; use a statement block instead | — |
RAV1903 |
Error | Continue statement not allowed here | Continue statements are not valid in expressions; use a statement block instead | — |
RAV1904 |
Error | Goto statement not allowed here | Goto statements are not valid in expressions; use a statement block instead | — |
RAV1905 |
Error | Label not allowed here | Labels are not valid in expressions; use a statement block instead | — |
RAV1906 |
Error | Nested try expression | Nested try expressions are not allowed | — |
RAV1907 |
Error | Throw statement not allowed here | Throw statements are not valid in expressions; use a statement block instead | samples/control-flow/throw-expression-basic.rav, samples/control-flow/try-catch-basic.rav |
RAV1908 |
Error | Match expression not allowed | Match expressions are not allowed after a try? expression | — |
RAV1909 |
Error | By-reference return cannot reference local storage | Cannot return a by-reference value that points to local '{localName}' | — |
RAV1910 |
Error | By-reference return cannot reference value parameter storage | Cannot return a by-reference value that points to value parameter '{parameterName}' | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1911 |
Error | Pointer type requires unsafe | Pointer types require unsafe mode ('--unsafe'). | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1912 |
Error | Pointer operation requires unsafe | Pointer operations require unsafe mode ('--unsafe'). | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1918 |
Error | Fixed expression requires use initializer | fixed is only valid as the initializer of a use declaration. |
— |
RAV1919 |
Error | Fixed expression requires address-of operand | fixed requires an explicit address-of operand written as &expr. |
— |
RAV1920 |
Error | Stack allocation requires an unmanaged element type | The stack allocation element type must not contain managed references. | — |
RAV1921 |
Error | Stack allocation count must be an integer | The stack allocation count must be implicitly convertible to int. |
— |
RAV1922 |
Error | Stack allocation count cannot be negative | A negative constant stack allocation count is invalid. | — |
RAV1913 |
Error | Dereference requires pointer or by-reference operand | Cannot dereference '{operandType}'. '*' requires a pointer or by-reference value. | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1914 |
Error | Pointer member access requires pointer receiver | You can only use '->' on a pointer; '{receiverType}' is not a pointer. | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1915 |
Error | Extern members must be static | Member '{memberName}' cannot be marked 'extern' unless it is static | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1916 |
Error | Extern member cannot have a body | '{memberName}' cannot declare a body because it is marked extern | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1917 |
Warning | Unsafe mode is enabled | Unsafe mode is enabled | samples/unmanaged/pointers.rav, samples/unmanaged/test.rav |
RAV1955 |
Error | Non-invocable member | Non-invocable member '{memberName}' cannot be used like a method | — |
RAV2001 |
Error | Numeric literal out of range | The numeric literal is out of range for its target type | — |
RAV2002 |
Error | Unterminated character literal | Unterminated character literal | — |
RAV2003 |
Error | Invalid escape sequence | Invalid escape sequence in character literal | — |
RAV2010 |
Error | Target-typed member access requires a known type | Cannot resolve member '.{memberName}' without a known target type | — |
RAV2011 |
Error | 'default' requires a target type | The 'default' literal can only be used when a target type is known | — |
RAV2020 |
Error | Invalid alias target | Invalid alias target. Supported targets are types, namespaces, ad-hoc unions, tuples, and predefined types like bool, char, int, long, float, double, string, and unit. | — |
RAV2021 |
Error | Invalid use target | You can only import namespaces and types. | — |
RAV2022 |
Error | Spread source must be enumerable | Cannot spread expression of type '{typeName}' because it is not enumerable | — |
RAV2023 |
Error | Single-element tuple type is not allowed | Single-element tuple types are not supported; use parenthesized type syntax only for grouping | — |
RAV2100 |
Error | Match must cover all cases | Missing match case: '{missingType}'. | samples/patterns/match-expression.rav, samples/patterns/match-type-pattern-basic.rav, samples/unions/union-basic.rav |
RAV2101 |
Error | Match arm is unreachable | This match arm can never run (a previous arm matches first). | samples/patterns/match-expression.rav, samples/patterns/match-type-pattern-basic.rav, samples/unions/union-basic.rav |
RAV2102 |
Error | Match arm pattern is not valid | Pattern {patternType} is not valid for scrutinee of type '{scrutineeType}' | samples/patterns/match-expression.rav, samples/patterns/match-type-pattern-basic.rav, samples/unions/union-basic.rav |
RAV2103 |
Warning | Match catch-all is redundant | This catch-all never matches. | samples/patterns/match-expression.rav, samples/patterns/match-type-pattern-basic.rav, samples/unions/union-basic.rav |
RAV2104 |
Error | Case pattern requires union | Case pattern '{caseName}' requires a union target | samples/patterns/match-expression.rav, samples/patterns/match-type-pattern-basic.rav, samples/unions/union-basic.rav |
RAV2105 |
Error | Case not found on union | Union '{unionName}' does not contain a case named '{caseName}' | samples/patterns/match-expression.rav, samples/patterns/match-type-pattern-basic.rav, samples/unions/union-basic.rav |
RAV2106 |
Error | Case pattern payload count mismatch | Case '{caseName}' expects {expected} argument(s) but received {actual} | samples/patterns/match-expression.rav, samples/patterns/match-type-pattern-basic.rav, samples/unions/union-basic.rav |
RAV2107 |
Warning | Match statement value is ignored | This match statement produces a value, but it will not be returned. Either add explicit 'return' statements in statement form, or use expression form where the surrounding context expects a value. | — |
RAV2108 |
Warning | If statement value is ignored | This if statement produces values in its branches, but statement-form 'if' does not return a value. Either add explicit 'return' statements in statement form, or use expression form where the surrounding context expects a value. | — |
RAV2109 |
Warning | Try statement value is ignored | This try statement produces values in its try/catch blocks, but statement-form 'try' does not return a value. Either add explicit 'return' statements in statement form, or use expression form where the surrounding context expects a value. | — |
RAV2110 |
Warning | Match arm pattern does not fully cover subtype/case | Pattern for '{typeName}' does not cover all values. Add broader sub-patterns or a catch-all arm. | samples/oop/sealed-record-hierarchy-json-basic.rav, samples/unions/union-basic.rav |
RAV2111 |
Error | Union member name is reserved | Union '{unionName}' reserves the member name '{memberName}' for synthesized members. | — |
RAV2112 |
Error | Union special member not supported | Union '{unionName}' does not support authored member '{memberName}'. | — |
RAV2116 |
Error | Union requires a case | Union '{unionName}' must declare at least one case | — |
RAV2117 |
Error | Parenthesized union requires two variants | Parenthesized union '{unionName}' must declare at least two variant types | — |
RAV2200 |
Error | Lambda parameter type cannot be inferred | Cannot infer the type of parameter '{parameterName}'. Specify an explicit type or use the lambda in a delegate-typed context | — |
RAV2201 |
Error | Method group requires delegate type | Method group '{methodName}' cannot be used as a value without a delegate type. Specify a delegate annotation or use the method in a target-typed context | — |
RAV2202 |
Error | Method group conversion is ambiguous | Method group '{methodName}' is ambiguous in this context. Specify a delegate type to disambiguate the target overload | — |
RAV2203 |
Error | No overload matches delegate | No overload for method '{methodName}' matches delegate type '{delegateType}' | — |
RAV2500 |
Error | Label already defined | A label named '{name}' is already defined in this scope | samples/control-flow/goto-statement-basic.rav |
RAV2501 |
Error | Label not found | The label '{name}' is not in scope | samples/control-flow/goto-statement-basic.rav |
RAV2502 |
Error | Reserved word cannot be used as a label | The identifier '{name}' is a reserved word and cannot be used as a label | samples/control-flow/goto-statement-basic.rav |
RAV2600 |
Error | Break statement not within loop | Break statements are only valid inside loops | — |
RAV2601 |
Error | Continue statement not within loop | Continue statements are only valid inside loops | — |
RAV2606 |
Error | Label does not identify an enclosing loop | The label '{name}' does not identify an enclosing loop | — |
RAV2602 |
Error | Range for-loop requires an end value | Ranges in for loops must specify an end value | — |
RAV2603 |
Error | Range for-loop does not support from-end indices | Range boundaries in for loops must count from the start | — |
RAV2604 |
Error | Range for-loop step cannot be zero | Range for-loop step cannot be zero | — |
RAV2605 |
Error | Range for-loop by-clause requires a range | The 'by' clause is only supported for range-based for loops | — |
RAV2700 |
Error | await needs async | The 'await' operator can only be used within an async method or function | samples/async/async-await.rav, samples/async/async-task-return.rav, samples/entrypoints/main-function-async-task-basic.rav |
RAV2701 |
Error | Not awaitable | The type '{typeName}' is not awaitable | samples/async/async-await.rav, samples/async/async-task-return.rav, samples/entrypoints/main-function-async-task-basic.rav |
RAV2702 |
Error | Awaiter is missing IsCompleted | The awaiter type '{awaiterType}' must have an accessible instance property 'IsCompleted' returning 'bool' | samples/async/async-await.rav, samples/async/async-task-return.rav, samples/entrypoints/main-function-async-task-basic.rav |
RAV2703 |
Error | Awaiter is missing GetResult | The awaiter type '{awaiterType}' must have an accessible parameterless 'GetResult' method | samples/async/async-await.rav, samples/async/async-task-return.rav, samples/entrypoints/main-function-async-task-basic.rav |
RAV2704 |
Error | Async return type must be Task-like | Async return type '{returnType}' is not supported; async functions must return Task-like types such as Task, Task<T>, ValueTask, or ValueTask<T>. The diagnostic suggests the concrete Task<...> wrapper Raven expects when the annotated type is a plain result type. |
samples/async/async-await.rav, samples/async/async-task-return.rav, samples/async/async-valuetask.rav, samples/entrypoints/main-function-async-task-basic.rav |
RAV2705 |
Error | Async Task return cannot include a value | Since '{methodName}' is an async method that returns 'Task', a return keyword cannot include a value | samples/async/async-await.rav, samples/async/async-task-return.rav, samples/entrypoints/main-function-async-task-basic.rav |
RAV2706 |
Warning | Async body lacks await | This async {memberDescription} has no 'await' and will run synchronously. | samples/async/async-await.rav, samples/async/async-task-return.rav, samples/entrypoints/main-function-async-task-basic.rav |
RAV2800 |
Error | Pipe target must be invocable | The pipe operator requires an invocation or settable property access on the right-hand side | samples/operators/pipe-operator-method-call-basic.rav, samples/operators/pipe-operator-lambda-basic.rav, samples/operators/pipe-operator-terminal-call-basic.rav |
RAV2801 |
Error | 'self' is not available in static context | 'self' is not available in a static context. | — |
RAV3600 |
Error | Unexpected token | Unexpected token '{token}' | — |
RAV3601 |
Error | Unmatched character | Unmatched '{character}' | — |
RAV4000 |
Warning | Documentation comment is not attached | Documentation comments must appear immediately before a declaration | samples/runtime/documentation-comment-basic.rav |
RAV4001 |
Warning | Documentation comment is not valid XML | Documentation comment is not well-formed XML: {message} | samples/runtime/documentation-comment-basic.rav |
RAV4002 |
Warning | Documentation comment is not valid Markdown | Documentation comment is not well-formed Markdown: {message} | samples/runtime/documentation-comment-basic.rav |
RAV4003 |
Warning | Documentation comment indentation is inconsistent | Documentation comment lines must have consistent indentation | samples/runtime/documentation-comment-basic.rav |
RVNGEN001 |
Error | Source generator failure | Source generator '{generatorName}' failed: {message} | — |
RVNJS001 |
Error | Unsupported JavaScript import | JavaScript import '{methodName}' is not supported by the current Raven interop generator: {reason} | samples/projects/browser-wasm |
RVNJS002 |
Error | Unsupported JavaScript export | JavaScript export '{methodName}' is not supported by the current Raven interop generator: {reason} | samples/projects/browser-wasm |
Behavior notes
Struct-union boundaries
RAV0405 and RAV0406 protect struct-union call and return boundaries. A
struct-union value must be known active before it is passed to a struct-union
parameter or returned from a member. Values that may still be the
zero-initialized carrier state, such as default(U) or a parameter forwarded
unchanged, are rejected at the boundary. Omitting an optional struct-union
argument whose default is the carrier default is treated the same way at the
call site.
Named deconstruction
Raven also uses RAV1602 for named deconstruction elements such as
Person(Name: let name, Age: 42) and let (Name: name, Age: age) = person
when a supplied name does not match a supported Deconstruct parameter or
member on the target type.
Match exhaustiveness
For struct unions, RAV2100 considers the declared semantic case set. The
inactive default carrier state is not a formal source case; boundary diagnostics
such as RAV0405 and RAV0406 prevent it from crossing ordinary call and return
boundaries, and runtime matching retains a defensive fallback.
For a nullable union carrier U?, RAV2100 requires the declared union cases
plus null. That null is the nullable wrapper state, not a union pseudo-case.
RAV2103 reports a catch-all only when no declared case, nullable wrapper
null, or possible inactive default state remains.
The RAV2100 quick fix adds every missing arm for the selected match in one
action. It chooses an editable pattern suited to the scrutinee:
- sealed class hierarchies use typed bindings, such as
Identifier identifier - sealed record hierarchies use positional bindings, such as
Case(let no) - ad-hoc unions use typed bindings, such as
int value - nominal case-declaration unions use target-typed cases, such as
.Success(let value) - enums use target-typed constants, such as
.None - finite literal cases retain their literal, such as
falseornull
When one case is absent, the action names that arm. When several are absent, VS Code offers one Add all missing match arms action. The fix applies only to the selected match; document- or project-wide fix-all behavior is separate.