| # AST validation | 
 |  | 
 | _AST validation_ is a separate AST pass that visits each | 
 | item in the tree and performs simple checks. This pass | 
 | doesn't perform any complex analysis, type checking or | 
 | name resolution. | 
 |  | 
 | Before performing any validation, the compiler first expands | 
 | the macros. Then this pass performs validations to check | 
 | that each AST item is in the correct state. And when this pass | 
 | is done, the compiler runs the crate resolution pass. | 
 |  | 
 | ## Validations | 
 |  | 
 | Validations are defined in `AstValidator` type, which  | 
 | itself is located in `rustc_ast_passes` crate. This | 
 | type implements various simple checks which emit errors | 
 | when certain language rules are broken. | 
 |  | 
 | In addition, `AstValidator` implements `Visitor` trait | 
 | that defines how to visit AST items (which can be functions, | 
 | traits, enums, etc). | 
 |  | 
 | For each item, visitor performs specific checks. For | 
 | example, when visiting a function declaration, | 
 | `AstValidator` checks that the function has: | 
 |  | 
 | * no more than `u16::MAX` parameters; | 
 | * c-variadic argument goes the last in the declaration; | 
 | * documentation comments aren't applied to function parameters; | 
 | * and other validations. |