TLC Error Handling
Error Reporting
You might need to detect and report error conditions in your TLC code. Error detection
        and reporting are used most often in library functions. While rare, it is also possible to
        encounter error conditions in block target file code if the S-function
          mdlCheckParameters function does not detect an unforeseen
        condition.
To report an error condition detected in your TLC code, use the
          LibBlockReportError or LibBlockReportFatalError
        utility functions. Here is an example of using LibBlockReportError in
        the paramlib.tlc function LibBlockParameter to
        report the condition of an improper use of that function:
%if TYPE(param.Value) == "Matrix"
    %% exit if the parameter is a true matrix,
    %% i.e., has more than one row or columns.
    %if nRows > 1
      %assign errTxt = "Must access parameter %<param.Name> using "...
        "LibBlockMatrixParameter."
      %<LibBlockReportError([], errTxt)>
    %endif
  %endifBrowse through the files in the folder
           (open) for more examples
        of the use of matlabroot/rtw/c/tlcLibBlockReportError.
Generating Errors from TLC Files
TLC Error Generation Overview
To generate errors from TLC files, you can use the %exit directive.
          Alternatively, you can use one of the library functions described below that calls
            %exit for you. The two types of errors are 
Usage errors  | These can be caused by incorrect models.  | 
Fatal (internal) TLC coding errors  | These cannot be caused by incorrect models.  | 
Usage Errors
Usage errors are errors resulting from incorrect models or attributes defined on a model. For example, suppose you have an S-Function block and an inline TLC file for a specific D/A device. If a model can contain only one copy of this S-function, then an error needs to be generated for a model that contains two copies of this S-Function block.
Using Library Functions. To generate usage errors related to a specific block, use the library function
LibBlockReportError(block,"error string")
The block argument is the block record if it isn't scoped. If the
            block is currently scoped, then you can specify block as [ ].
To generate general usage errors that are not related to a specific block, use
LibReportError("error string")These library functions prefix the string Simulink Coder Error:
            to the message you provide when reporting the error.
For a usage example of these functions, refer to gensfun.tlc for
            block errors and commonsetup.tlc for common errors. There are other
            files that use these functions in the TLC source folders within
                 (open.matlabroot/rtw/c/tlc
Fatal (Internal) TLC Coding Errors
Suppose you have an S-function that has a local function that can accept only numerical numbers. You might want to add an assert requiring that the inputs be only numerical numbers. These asserts can indicate fatal coding errors for which the user does not have a way of building a model or specifying attributes that can cause the error to occur.
Using Library Functions. The two available library functions are
LibBlockReportFatalError(block,"fatal coding error message")
where  is the offending block
            record (or block[] if the block is already scoped), and
LibReportFatalError("fatal coding error message")for error messages that are not block specific. For example, to add assert code you could use
%if TYPE(argument) != "Number" %<LibBlockReportFatalError(block,"unexpected argument type")> %endif
These library functions prefix the string Simulink Coder Fatal:
            to the message you provide and display the call stack when reporting the error.
For a usage example of these functions, refer to gensfun.tlc for
            block errors and commonsetup.tlc for common errors. There are other
            files that use these functions in the folder
                 (open).matlabroot/rtw/c/tlc
Using %exit.  You can call %exit to generate fatal error messages. However,
            MathWorks suggests that you use one of the library functions described above.
When generating fatal error messages directly with %exit, it is
            good practice to give a stack trace with the error message. This lets you see the call
            chain of functions that caused the error. To generate a stack trace, generate the
            message using the format:
%setcommandswitch "-v1" %exit Simulink Coder Fatal: error string
Formatting Error Messages
If you want to display a formatted, multiple-line error message, create a local variable that contains the message text. For example:
%openfile message My message text with newlines %closefile message
After formatting your error message, use one of the error reporting library functions
          described above, such as LibReportError, to report your error when it
          occurs. For example:
%<LibReportError(message)>
The error reporting library functions provide an error message prefix, such as
            Simulink Coder Error:.
Testing Error Messages
It is strongly suggested that you test your error messages before releasing your new
          TLC code. To test your error messages, copy the relevant code into a
            test.tlc file and run
tlc test.tlc
at the MATLAB® prompt.
Using TLC Error Messages to Troubleshoot
This section lists and describes error messages generated by the Target Language Compiler. Use this reference to
Confirm that an error has been reported.
Determine possible causes for an error.
Determine possible ways to fix an error.
%closefile or %selectfile or %flushfile argument must be a valid open file
In %closefile or %selectfile or
          %flushfile, the argument must be a valid file variable opened with
          %openfile.
%define no longer supported, use %function instead
Macros are not supported. You must rewrite macros as functions or inline them in your code.
%error directive: text
Code containing the %error directive generates this message. It
        normally indicates some condition that the code was unable to handle and displays the text
        following the %error directive.
%exit directive: text
Code containing the %exit directive causes this message. It typically
        indicates some condition that the code was unable to handle and displays the text following
        the %exit directive. Note that this directive causes the Target Language
        Compiler to terminate regardless of the -mnumber command-line
        option.
%filescope has already been used in this file
The user attempted to use the %filescope directive more than once in
        a file.
%trace directive: text
The %trace directive produces this error message and displays the
        text following the %trace directive. Trace directives are reported only
        when the -v option (verbose mode) appears on the command line. Note that
          %trace directives are not considered errors and do not cause the Target
        Language Compiler to stop processing.
%warning directive: text
The %warning directive produces this error message and displays the
        text following the %warning directive. Note that
          %warning directives are not considered errors and do not cause the
        Target Language Compiler to stop processing.
A %implements directive must appear within a block template file and must match the %language and type specified
A block template file was found, but it did not contain an
          %implements directive. An %implements directive is
        required so that the expected language and type are implemented by this block template file.
        See Object-Oriented Facility for Generating Target Code for more information.
A %switch statement can only have one %default
The user has written a %switch statement with multiple
          %default cases, as in the following example:
%switch expr
  %case 1
    code...
    %break
  %default
    
more code...
    %break
  %default		  %% error
    even more code...
    %break
%endswitchA language choice must be made using the %language directive prior to using GENERATE or GENERATE_TYPE
To use the GENERATE or GENERATE_TYPE built-in
        functions, the Target Language Compiler requires that you first specify the language being
        generated. This causes the block-level target file to implement the same language and type
        as specified in the %language directive.
A non-homogeneous vector was passed to GENERATE_FORMATTED_VALUE
The built-in GENERATE_FORMATTED_VALUE can process only vectors that
        have homogeneous elements (that is, vectors in which all the
        elements have the same type).
Ambiguous reference to identifier —         must use array index to refer to one of multiple scopes
In a repeated scope identifier from a database file, you must specify an index to disambiguate the reference. For example
Database file:
block
{
	Name				"Abc2"
	Parameter {
		Name			"foo"
		Value			2
	}
}
block
{
	Name				"Abc3"
	Parameter {
		Name			"foo"
		Value			3
	}
}
TLC file:
%<GETFIELD(block, "Name")>In the preceding example, the reference to block is ambiguous because
        multiple repeated scopes named block appear in the database file. Use an
        index to disambiguate the references, as in: 
%<GETFIELD(block[0], "Name")>
An %if statement can only have one %else
The user has written an %if statement with multiple
          %else blocks, as in the following example:
%if expr code... %else more code... %else %% error even mode code... %endif
Argument to identifier must be a         string
The following built-in functions expect a string and report this error if the argument passed is not a string.
CAST | GENERATE_FILENAME | 
EXISTS | GENERATE_FUNCTION_EXISTS | 
FEVAL | GENERATE_TYPE | 
FILE_EXISTS | GET_COMMAND _SWITCH | 
FORMAT | IDNUM | 
GENERATE | SYSNAME | 
Arguments to directive must be records
Arguments to %mergerecord and %copyrecord must be
        records. Also, the first argument to the following built-in functions must be a record: 
ISALIASREMOVEFIELDFIELDNAMESISFIELDGETFIELDSETFIELD
Arguments to TLC from the MATLAB command line must be strings
An attempt was made to invoke the Target Language Compiler from MATLAB, but some of the arguments that were passed were not strings.
Assertion failed
An expression in an %assert statement evaluated to false.
Assignment to scope identifier is only
        allowed when using the + operator to add members
Scope assignment must be scope = scope + variable.
Attempt to define a function identifier on top of an existing variable or function
A function cannot be defined twice. Make sure that you don't have the same function defined in separate TLC files.
Attempt to divide by zero
The Target Language Compiler does not allow division by zero.
Bad cast - unable to cast this expression to
          type
The Target Language Compiler cannot cast this expression from its current type to the specified type. For example, the Target Language Compiler cannot cast a string to a number, as in
%assign x = "1234"
%assign y = CAST("Number", x );Bad directory (dirname) in O:           filename
The -O option did not specify a valid folder.
builtin was expecting expression of type
          type, got one of type type
A built-in was passed an expression of incorrect type.
Cannot %undef any builtin functions or variables
User is not allowed to undefine a TLC built-in or variable. For example
%undef FORMAT %% error
Cannot convert string your_string to a
        number
Cannot convert the string to a number.
Changing value of identifier from the RTW
        file
You have overwritten the value that appeared in the .rtw file.
Error opening filename
The Target Language Compiler could not open the file specified on the command line.
Error writing to file error
There was an error while writing to the current output stream; error
        contains the system specific error message.
Errors occurred — aborting
This error message is the last error to be reported. It occurs when either
The number of error messages exceeds the maximum (one by default).
Processing completes and errors have occurred.
Expansion directives %<> cannot be nested
It is illegal to nest expansion directives. For example,
%<foo(%<expr>)>
Instead, do the following:
%assign tmp = %<expr> %<foo(tmp)>
Expansion directives %<> cannot span multiple lines; use \ at end of line
An expansion directive cannot span multiple lines. To work around this restriction, use the \ line continuation character. The following is incorrect:
%<CompiledModel.System[Sysidx].Block[BlkIdx].Name + "Hello">
Instead, use:
%<CompiledModel.System[Sysidx].Block[BlkIdx].Name + \ "Hello">
Extra arguments to the function-name         built-in function were ignored (Warning)
The following built-in functions report this warning when too many arguments are passed to them:
CAST | NUMTLCFILES | 
EXISTS | OUTPUT_LINES | 
FILE_EXISTS | SIZE | 
FORMAT | STRING | 
GENERATE_FILENAME | STRINGOF | 
GENERATE_FUNCTION_EXISTS | SYSNAME | 
IDNUM | TLCFILES | 
ISFINITE | TYPE | 
ISINF | WHITE_SPACE | 
ISNAN | WILL_ROLL | 
File name too long (directory =dirname, name           =filename)
The specified filename was too long. The default limits are
        256 characters for filename and 1024 characters for
          dirname, but the limits can be larger, depending on the
        platform.
format is not a legal format value
The specified format was not legal for the %realformat directive.
        Valid format strings are "EXPONENTIAL" and
        "CONCISE".
Function argument mismatch; function           function_name expects number
        arguments
When calling a function, too many or too few arguments were passed to it.
Function reached the end and did not return a value
Functions that are not declared as void or Output
        must return a value. If a return value is not desired, declare the function as
          void, otherwise make it return a value.
Function values are not allowed
Attempt to use a TLC function as a variable.
Identifier identifier multiply defined. Second and
        succeeding definitions ignored.
The user is attempting to add the same field to a record more than once, as in the following code.
%createrecord err { foo 1; rec { val 2 } }
%addtorecord err foo 2             %% errorIdentifier identifier used on a %foreach         statement was already in scope (Warning)
The argument to a %foreach statement cannot be defined prior to
        entering the %foreach.
Illegal use of eval (i.e., %<...>)
It is illegal to use evals in .rtw files. There are also some places
        where evals are not allowed in directives. For example:
%function %<foo>(a, b, c) void %% error %endfunction
Indices may not be negative
An index used in a [ ] expression must be a nonnegative integer.
Indices must be constant integral numbers
An index used in a [ ] expression must be an integer number.
Invalid handle
An invalid handle was passed to the Target Language Compiler server mode.
Invalid identifier range, the leading strings string1 and
          string2 must match
In a range of signals, for example, u1:u10, the identifier in the
        first argument did not match the identifier in the second.
Invalid identifier range, the lower bound (bound) must be         less than the upper bound (bound)
In a range of signals, for example, u1:u10, the lower bound was
        higher than the upper bound. 
Invalid type for unary operator
Unary operators – and + require numeric types.
        Unary operator – requires an integral type. Unary operator
          ! requires a numeric type.
Invalid type type
An invalid type was passed to a built-in function.
It is illegal to return a function from a function
A function value cannot be returned from a function call.
Named value identifier already exists
        within this scope-identifier; use %assign to change the
        value
You cannot use the block addition operator + to add a value that is already a member of
        the indicated block. Use %assign to change the value of an existing
        value. This example produces this error:
%assign x = BLK { a 1; b 2 }
%assign a = 3
%assign x = x + aUse this instead:
%assign x.a = 3
No %case statement(s) seen yet, statement ignored
Statements that appear inside a %switch statement but precede
          %case statements are ignored, as in the following code:
%switch expr
%assign x = 2  %% this statement will be ignored
  %case 1
    code
    %break
%endswitchOnly double and character arrays can be converted from MATLAB to TLC. This can occur if the MATLAB function does not return a value (see %matlab)
Only double and character arrays can be converted from MATLAB to the Target Language Compiler. This error can occur if the MATLAB function does not return a value (see %matlab). For
        example,
%assign a = FEVAL("int8",3)
%matlab disp(a)Only one output is allowed from the TLC
An attempt was made to receive multiple outputs from the MATLAB version of the Target Language Compiler.
Only strings of length 1 can be assigned using the [ ] notation
The right-hand side of a string assignment using the [ ] operator must be a string of length 1. You can replace only a single character using this notation.
Only strings or cells of strings may be used as the argument to Query and ExecString
A cell containing nonstring data was passed as the third argument to
          Query or ExecString in server mode.
Only vectors of the same length as the existing vector value can be assigned using the [ ] notation
In the [ ] notation to replace a row of a matrix, the row must be a vector of the same length as the existing rows.
Output file identifier opened with         %openfile was not closed
Output files opened with %openfile must be closed with
          %closefile. The
           is the name of the variable
        specified in the identifier%openfile directive.
Note
This might also occur a syntax error is present in a code section between an
            openfile and closefile, or if you try to assign
          the output of a function of type void or Output to a
          variable.
Ranges, identifier ranges, and repeat values cannot be repeated
You cannot repeat a range, identifier range, or repeat value. This prevents things like
          [1@2@3].
String cannot modify the setting for the command line switch             '-switch'
switch'%setcommandswitch does not recognize the specified switch, or cannot
        modify it (e.g., -r cannot be modified).
string is not a recognized user defined property of this         handle
The query performed on a TLC server mode handle is looking for an undefined property.
Syntax error
The indicated line contains a syntax error, for more information on syntax, see Target Language Compiler Directives.
The %break directive can only appear within a %foreach, %for, %roll, or %switch statement
The %break directive can be used only in a
          %foreach, %for, %roll, or
          %switch statement.
The %case and %default directives can only be used within the %switch statement
A %case or %default directive can appear only
        within a %switch statement.
The %continue directive can only appear within a %foreach, %for, or %roll statement
The %continue directive can be used only in a
          %foreach, %for, or %roll
        statement.
The %foreach statement expects a constant numeric argument
The argument of a %foreach must be a numeric type. For
        example:
%foreach Index = [1 2 3 4] ... %endforeach
%foreach cannot accept a vector as input.
The %if statement expects a constant numeric argument
The argument of an %if statement must be a numeric type. For example, 
%if [ 1 2 3 ] ... %endif
%if cannot accept a vector as input.
The %implements directive expects a string or string vector as the list of languages
You can use the %implements directive to specify a string for the
        language being implemented, or to indicate that it implements multiple languages by using a
        vector of strings. You cannot specify any other argument type
        to the %implements directive.
The %implements directive specifies type as the           type where type was expected
The type specified in the %implements directive must exactly match
        the type specified in the block or on the GENERATE_TYPE directive. If you
        want to specify that the block accept multiple input types, use the %implements
          * directive, as in
%implements * "C" %% I accept any type and generate C code
The %implements language does not match the language currently being         generated (language)
The language or languages specified in the %implements directive must
        exactly match the %language directive.
The %return statement can only appear within the body of a function
A %return statement can be only in the body of a function.
The == and != operators can only be used to compare values of the same type
The == and != operator arguments must be the same type. You can use the
          CAST() built-in function to change them into the same type.
The argument for %openfile must be a valid string
When you open an output file, the name specified for the file must be a valid string.
The argument for %with must be a valid scope
The argument to %with must be a valid scope identifier. For example, 
%assign x = 1 %with x ... %endwith
In this code, the %with statement argument is a number and produces
        this error message.
The argument for an [ ] operation must be a repeated scope symbol, a vector, or a matrix
When you use the [ ] operator to index, the expression on the left of the brackets must be a vector, matrix, string, numeric constant, or a repeated scope identifier. When you use array indexing on a scalar, the constant is automatically scalar expanded and the value of the scalar is returned. For example,
%openfile x %assign y = x[0]
This example causes this error because x is a file and is not valid
        for indexing.
The argument to %addincludepath must be a valid string
The argument to %addincludepath must be a string.
The argument to %include must be a valid string
The argument to the input file control directive must be a valid string with the filename given in double quotation marks.
The begin directive must be in the same file as the corresponding end directive.
These Target Language Compiler begin directives must appear in the
        same file as their corresponding end directives:
          %function, %switch, %foreach,
          %roll, and %for. Place the construct entirely within
        one Target Language Compiler source file.
The begin directive on this line has         no matching end directive
For block-scoped directives, this error is produced if a matching end
        directive is missing. This error can occur for the following block-scoped Target Language
        Compiler directives. 
| Begin Directive | End Directive | Description | 
|---|---|---|
%if | %endif | Conditional inclusion  | 
%for | %endfor | Looping  | 
%foreach | %endforeach | Looping  | 
%roll | %endroll | Loop rolling  | 
%with | %endwith | Scoping directive  | 
%switch | %endswitch | Switch directive  | 
%function | %endfunction | Function declaration directive  | 
{ | } | Record creation  | 
The error is reported on the line that opens the scope and does not have matching
          end scope.
Note
Nested scopes must be closed before their parent scopes. Failure to include an
            end for a nested scope often causes this error, as in 
%if Block.Name == "Sin 3" %foreach idx = Block.Width %endif %% Error reported here that the %foreach was not terminated
The construct %matlab function_name(...) construct is         illegal in standalone tlc
You cannot call MATLAB from stand-alone TLC.
The FEVAL() function can accept only 2-dimensional arrays from MATLAB, not number dimensions
Return values from MATLAB can have at most two dimensions.
The FEVAL() function can accept vectors of numbers or strings only when calling MATLAB
Vectors passed to MATLAB can be numbers or strings. See FEVAL Function.
The FEVAL() function requires the name of a function to call
FEVAL requires a function to call. This error appears only inside
          MATLAB.
The final argument to %roll must be a valid block scope
When you use %roll, the final argument (prior to extra user-specified
        arguments) must be a valid block scope. See %roll for a
        description of this command.
The first argument of a ? : operator must be a Boolean expression
The ? : operator must have a Boolean expression as its first
        operand.
The first argument to GENERATE or GENERATE_TYPE must be a valid scope
When you call GENERATE or GENERATE_TYPE, the
        first argument must be a valid scope. See the GENERATE and GENERATE_TYPE Functions for more information and examples.
The function name requires at least           number arguments
User is passing too few arguments to a function, as in the following code:
%function foo(a, b, c) %return a + b + c %endfunction %<foo(1, 2)> %% error
The GENERATE function requires at least 2 arguments
When you call the GENERATE built-in function, the first two
        arguments must be the block and the name of the function to call.
The GENERATE_TYPE function requires at least 3 arguments
When you call the GENERATE_TYPE built-in function, the first three
        arguments must be the block, the name of the function to call, and the type.
The ISINF(), ISNAN(), ISFINITE(), REAL(), and IMAG() functions expect a real or complex valued argument
These functions expect a Real or complex value as the input
        argument.
The language being implemented cannot be changed within a block template file
You cannot change the language using the %language directive within a
        block template file.
The language being implemented has changed from           old-language to new-language
        (Warning)
The language being implemented should not be changed in midstream because
          GENERATE function calls that appear prior to the
          %language directive can cause generate functions
        to load for the prior language. Only one language directive should appear in a given
        file.
The left-hand side of a . operator must be a valid scope identifier
When you use the . operator, the left-hand side of the
          . operator must be a valid in-scope identifier. For example:
%assign x = 1 %assign y = x.y
In this code, the reference to x.y produces this error message
        because x is not defined as a scope.
The left-hand side of an assignment must be a simple expression comprised of ., [ ], and identifiers
Illegal left-hand side of assignment.
The number of columns specified
          (specified-columns) did not match the actual number of columns
        in the rows (actual-columns)
When you specify a Target Language Compiler matrix, the number of columns specified must match the actual number of columns in the matrix. For example,
%assign mat = Matrix(2,1) [[1,2];[2,3]]
In this case, the number of columns in the declaration of the matrix (1) did not match the number of columns seen in the matrix (2). Either change the number of columns in the matrix, or change the matrix declaration.
The number of rows specified           (specified-rows) did not match the actual number of rows seen
        in the matrix (actual-rows)
When you specify a Target Language Compiler matrix, the number of rows must match the actual number of rows in the matrix. For example,
%assign mat = Matrix(1,2) [[1,2];[2,3]]
In this case, the number of rows in the declaration of the matrix (1) did not match the number of rows seen in the matrix (2). Either change the number of rows in the matrix or change the matrix declaration.
The operator_name operator only works on         Boolean arguments
The && and || operators work only on
        Boolean values.
The operator_name operator only works on         integral arguments
The &, ^, |,
          <<, >> and %
        operators work on numbers only.
The operator_name operator only works on         numeric arguments
The arguments to the following operators both must be either numeric or real:
          <, <=, >,
          >=, -, *,
        /. This error can also occur when you use + as a unary
        operator. In addition, the FORMAT built-in function expects either a
        numeric or real argument.
The return value from the RollHeader function must be a string
When you use %roll, the RollHeader() function
        specified in Roller.tlc must return a string value. See %roll for a
        complete discussion of the %roll construct.
The roll argument to %roll must be a nonempty vector of numbers or ranges
When you use %roll, the roll vector cannot be
        empty and must contain numbers or ranges of numbers. See %roll for a
        complete discussion of the %roll construct.
The second value in a Range must be greater than the first value
In a range, for example, 1:10, the lower bound was higher than the
        upper bound.
The specified index (index) was out of the         range 0 - number-of-elements - 1
This error occurs when you index into a nonscalar beyond the end of the variable. For example:
%assign x = [1 2 3] %assign y = x[3]
This example would cause this error. Remember, in the Target Language Compiler, array indices start at 0 and go to the number of elements minus 1.
The STRINGOF built-in function expects a vector of numbers as its argument
The STRINGOF function expects a vector of numbers. The function
        treats each number as the ASCII value of a valid character.
The SYSNAME built-in function expects an input string of the form           xxx/yyy
The SYSNAME function takes a single string of the form
          xxx/yyy as it appears in the .rtw
        file and returns a vector of two strings, xxx and yyy.
        If the input argument does not match this format, SYSNAME returns this
        error.
The threshold on a %roll statement must be a single number
When you use %roll, the roll threshold specified must be a single
        number. See %roll for a complete discussion of the %roll construct.
The use of feature is being deprecated and will not be         supported in future versions of TLC. See the TLC manual for alternatives.
The %define and %generate directives are not
        recommended, as they are being replaced.
The WILL_ROLL built in function expects a range vector and an integer threshold
The WILL_ROLL function requires both arguments cited in the
        message.
There are no more free contexts. Use tlc('close', HANDLE) to free up a context
The global context table has filled up while the TLC server mode is in use.
There was no type associated with the given block for GENERATE
The scope specified to GENERATE must include a
          Type parameter that indicates which template file should be used to
        generate code for the specified scope. For example:
%assign scope = block { Name "foo" }
%<GENERATE( scope, "Output" )>This example produces the error message because the scope does not include the parameter
          Type. See the GENERATE and GENERATE_TYPE Functions for more information
        and examples.
This assignment would overwrite an identifier-value pair from the RTW file. To avoid this error either qualify the left-hand side, or choose another identifier.
The user is trying to modify a field of a record in a %with block
        without qualifying the left-hand side, as in this example:
  %createrecord foo { field 1 }
  %with foo
    %assign field = 2  %% error
  %endwithInstead, use
%createrecord foo { field 1 }
  %with foo
    %assign foo.field = 2
  %endwithTLC has leaked number symbols. You may         have created a cyclic record. If this not the case then report this leak
        to MathWorks.
There has been a memory leak while running TLC. The most common cause of this is having cyclic records.
Unable to find identifier within the           scope-identifier scope
The given identifier was not found in the scope specified. For example,
%assign scope = ascope { x 5 }
%assign y = scope.yIn this code, the reference to scope.y produces this error
        message.
Unable to open %include file         filename
The file included in an %include directive was not found on the path.
        Either move the file to a location on the current path, or use the -I
        command-line option or the %addincludepath directive to specify the
        folder that contains the file.
Unable to open block template file           filename from GENERATE or GENERATE_TYPE
You specified GENERATE but the given filename was not found on the
        Target Language Compiler path. You can
Add the file to a folder on the path.
Use the
%generatefiledirective to specify an alternative filename for this block type that is on the path.Add the folder in which this file appears to the search path using the
-Icommand-line option or the%addincludepathdirective.
Unable to open output file         filename
The specified output file could not be opened. Either an invalid filename was specified or the file was read only.
Undefined identifier         identifier_name
The identifier specified in this expression was undefined.
Unknown type type in CAST
        expression
When you call the CAST built-in function, the type must be a valid
        type from the Target Language Value Types table.
Unrecognized command line switch passed to string:         switch
You queried the current state of a switch, but the switch specified was not recognized.
Unrecognized directive directive-name         seen
An illegal % directive was encountered. The valid directives are
        shown below. 
%addincludepath | %addtorecord | 
%assert | %assign | 
%break= | %case | 
%closefile | %continue | 
%copyrecord | %createrecord | 
%default | %define | 
%else | %elseif | 
%endbody | %endfor | 
%endforeach | %endfunction | 
%endif | %endroll | 
%endswitch | %endwith | 
%error | %exit | 
%filescope | %for | 
%foreach | %function | 
%generate | %generatefile | 
%if | %implements | 
%include | %language | 
%matlab | %mergerecord | 
%openfile | %realformat | 
%return | %roll | 
%selectfile | %setcommandswitch | 
%switch | %trace | 
%undef | %warning | 
%with | 
Unrecognized type output-type for         function
The function type modifier was not Output or void.
        For functions that do not produce output, the default without a type modifier indicates that
        the function should not produce output.
Unterminated multiline comment.
A multiline comment (i.e., /% %/) does not have a terminator, as in the following code:
/% my comment %assign x = 2 %assign y = x * 7
Unterminated string
A string must be closed prior to the end of an expansion directive or the end of a line.
Usage: tlc [options] file
A command-line problem has occurred. The error message contains a list of the available options.
Use of feature incurs a         performance hit, see TLC manual for
        possible workarounds.
The %undef and expansion (i.e., %<expr>)
        features can degrade performance.
Value of type type cannot be         compared
Values of the specified  cannot be
        compared.type
Values of specified_type type cannot be         expanded
The specified type cannot be used on an expansion directive. Files and scopes cannot be expanded. This error can also occur when you expand a function without any arguments. If you use
%<Function>
call it with the required arguments.
Values of type Special, Macro Expansion, Function, File, Full Identifier, and Index cannot be converted to MATLAB variables
Values of the types listed in the message cannot converted to MATLAB variables.
When appending to a buffer stream, the variable must be a string
You can specify the append option for a buffer stream only if the
        variable currently exists as a string. Do not use the append option if
        the variable does not exist or is not a string. This example produces this error.
%assign x = 1 %openfile x , "a" %closefile x
TLC Function Library Error Messages
The functions in the TLC function library can generate many error messages that are not documented. These messages are sufficiently self-descriptive so that they do not need additional explanation. However, if you encounter an error message that does not provide enough description to resolve your problem, contact our technical support staff.