This section describes behavior that is not defined by the ANSI standard.
A message is output if a source file contains a character not specified by the character set.
A message is output if there is a single or double quotation mark ("/") in the last category (a delimiter or a single non-whitespace character that does not lexically match another preprocessing lexical type).
Since all identifier characters have meaning, there are no meaningless characters.
A message is output if both internal and external binding was performed on the same identifier within a translation unit.
All declarations referencing the same object or function must be compatible. Otherwise, a message will be output.
Specific non-graphical characters can be expressed by means of extended notation, consisting of a backslash (\) followed by a lower-case letter. The following are available: \a, \b, \f, \n, \r, \t, and \v. There is no other extended notation; other letters following a backslash (\) become that letter.
When a simple string literal is adjacent to a wide string literal token, simple string concatenation is performed.
Users modify string literals at their own risk. Although the string will be changed if it is allocated to RAM, it will not be changed if it is allocated to ROM.
If the following characters appear in strings between the delimiter characters < and >, or between two double quotation marks ("), then they are treated as part of the file name: characters, comma (,), double quote ("), two slashes (//), or slash-asterisk (/*). The backslash (\) is treated as a folder separator.
If a floating-point type is converted into an integral type, and the integer portion cannot be expressed as an integral type, then the value is truncated until it can.
A message is output if an incomplete type becomes an lvalue.
If there are too few arguments, then the values of the formal parameters will be undefined. If there are too many arguments, then the excess arguments will be ignored when the function is executed, and will have no effect.
A message will be output if there is a function declaration before the function call.
If a function is defined without a function prototype, and the types of the extended arguments do not match the types of the extended formal parameters, then the values of the formal parameters will be undefined.
If a function is defined with a type that is not compatible with the type specified by the expression indicating the called function, then the return value of the function will be invalid.
If a function is defined in a form that includes a function prototype, and the type of an extended argument is not compatible with that of a formal parameter, or if the function prototype ends with an ellipsis, then it will be interpreted as the type of the formal parameter.
If an incorrect value is assigned to a pointer, then the behavior of the unary * operator will either obtain an undefined value or result in an illegal access, depending on the hardware design and the contents of the incorrect value.
If a typecast pointer is used to call a function with other than the original type, then it is possible to call the function. If the parameters or return value are not compatible, then it will be invalid.
If a pointer is cast into an integral type, and the amount of storage is too small, then the storage of the cast type will be truncated.
A message will be output if a divide by zero is detected during compilation.
During execution, a divide by zero will raise an exception. If an error-handling routine has been coded, it will be handled by this routine.
If addition or subtraction is performed on a pointer that does other than indicate elements in an array object, the behavior will be as if the pointer indicates an array element.
If subtraction is performed using two pointers that do not indicate elements in the same array object, the behavior will be as if the pointers indicate array elements.
If the value of the right operand is negative, or greater than the bit width of the extended left operand, then the result will be the shifted value of the right operand, masked by the bit width of the left operand.
If the objects pointed to by the pointers being compared are not members of the same structure or union object, then the relational operation will be performed as if it were for pointers pointing to members of the same structure or union object.
If a value stored in an object is accessed via another object that overlaps that object's storage area in some way, then the overlapping portion must match exactly. Furthermore, the types of the two objects must have modified or non-modified versions with compatible types. Assignment to non-matching overlapping storage could cause the value of the assignment source to become corrupted.
If the member declaration list does not include named members, then a message will be output warning that the list has no effect. Note, however, that the same message will be output accompanied by an error if the -Xansi option is specified.
A message will be output if an attempt is made to modify an object defined with a const modifier, using an lvalue that is the non-const modified version. Casting is also prohibited.
A message will be output if an attempt is made to modify an object defined with a volatile modifier, using an lvalue that is the non-volatile modified version.
A message will be output if a return statement without an expression is executed, and the caller uses the return value of the function, and there is a declaration. If there is no declaration, then the return value of the function will be undefined.
If a function taking a variable number of arguments is defined without a parameter type list that ends with an ellipsis, then the values of the formal parameters will be undefined.
If a replacement operation generates a "defined" token, or if the usage of the "defined" unary operator before macro replacement does not match one of the two formats specified in the constraints, then it will be handled as an ordinary "defined".
A message is output if the arguments (before argument replacement) do not contain preprocessing tokens.
A message is output if an argument list contains a preprocessor token stream that would function as a processing directive in another circumstance.
A message is output if the results of replacement are not a correct simple string literal.
A message is output if the results of replacement are not a correct simple string literal.