| # 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. |