|
1 | 1 | # Compiler Test Documentation
|
2 | 2 |
|
3 |
| -In the Rust project, we use a special set of commands embedded in |
4 |
| -comments to test the Rust compiler. There are two groups of commands: |
5 |
| - |
6 |
| -1. Header commands |
7 |
| -2. Error info commands |
8 |
| - |
9 |
| -Both types of commands are inside comments, but header commands should |
10 |
| -be in a comment before any code. |
11 |
| - |
12 |
| -## Summary of Error Info Commands |
13 |
| - |
14 |
| -Error commands specify something about certain lines of the |
15 |
| -program. They tell the test what kind of error and what message you |
16 |
| -are expecting. |
17 |
| - |
18 |
| -* `~`: Associates the following error level and message with the |
19 |
| - current line |
20 |
| -* `~|`: Associates the following error level and message with the same |
21 |
| - line as the previous comment |
22 |
| -* `~^`: Associates the following error level and message with the |
23 |
| - previous line. Each caret (`^`) that you add adds a line to this, so |
24 |
| - `~^^^^^^^` is seven lines up. |
25 |
| - |
26 |
| -The error levels that you can have are: |
27 |
| - |
28 |
| -1. `ERROR` |
29 |
| -2. `WARNING` |
30 |
| -3. `NOTE` |
31 |
| -4. `HELP` and `SUGGESTION`* |
32 |
| - |
33 |
| -\* **Note**: `SUGGESTION` must follow immediately after `HELP`. |
34 |
| - |
35 |
| -## Summary of Header Commands |
36 |
| - |
37 |
| -Header commands specify something about the entire test file as a |
38 |
| -whole. They are normally put right after the copyright comment, e.g.: |
39 |
| - |
40 |
| -```Rust |
41 |
| -// Copyright blah blah blah |
42 |
| -// except according to those terms. |
43 |
| - |
44 |
| -// ignore-test This doesn't actually work |
45 |
| -``` |
46 |
| - |
47 |
| -### Ignoring tests |
48 |
| - |
49 |
| -These are used to ignore the test in some situations, which means the test won't |
50 |
| -be compiled or run. |
51 |
| - |
52 |
| -* `ignore-X` where `X` is a target detail or stage will ignore the test accordingly (see below) |
53 |
| -* `ignore-pretty` will not compile the pretty-printed test (this is done to test the pretty-printer, but might not always work) |
54 |
| -* `ignore-test` always ignores the test |
55 |
| -* `ignore-lldb` and `ignore-gdb` will skip a debuginfo test on that debugger. |
56 |
| - |
57 |
| -`only-X` is the opposite. The test will run only when `X` matches. |
58 |
| - |
59 |
| -Some examples of `X` in `ignore-X`: |
60 |
| - |
61 |
| -* Architecture: `aarch64`, `arm`, `asmjs`, `mips`, `wasm32`, `x86_64`, `x86`, ... |
62 |
| -* OS: `android`, `emscripten`, `freebsd`, `ios`, `linux`, `macos`, `windows`, ... |
63 |
| -* Environment (fourth word of the target triple): `gnu`, `msvc`, `musl`. |
64 |
| -* Pointer width: `32bit`, `64bit`. |
65 |
| -* Stage: `stage0`, `stage1`, `stage2`. |
66 |
| - |
67 |
| -### Other Header Commands |
68 |
| - |
69 |
| -* `min-{gdb,lldb}-version` |
70 |
| -* `min-llvm-version` |
71 |
| -* `compile-pass` for UI tests, indicates that the test is supposed |
72 |
| - to compile, as opposed to the default where the test is supposed to error out. |
73 |
| -* `compile-flags` passes extra command-line args to the compiler, |
74 |
| - e.g. `compile-flags -g` which forces debuginfo to be enabled. |
75 |
| -* `should-fail` indicates that the test should fail; used for "meta testing", |
76 |
| - where we test the compiletest program itself to check that it will generate |
77 |
| - errors in appropriate scenarios. This header is ignored for pretty-printer tests. |
78 |
| -* `gate-test-X` where `X` is a feature marks the test as "gate test" for feature X. |
79 |
| - Such tests are supposed to ensure that the compiler errors when usage of a gated |
80 |
| - feature is attempted without the proper `#![feature(X)]` tag. |
81 |
| - Each unstable lang feature is required to have a gate test. |
82 |
| - |
83 |
| -## Revisions |
84 |
| - |
85 |
| -Certain classes of tests support "revisions" (as of the time of this |
86 |
| -writing, this includes run-pass, compile-fail, run-fail, and |
87 |
| -incremental, though incremental tests are somewhat |
88 |
| -different). Revisions allow a single test file to be used for multiple |
89 |
| -tests. This is done by adding a special header at the top of the file: |
90 |
| - |
91 |
| -``` |
92 |
| -// revisions: foo bar baz |
93 |
| -``` |
94 |
| - |
95 |
| -This will result in the test being compiled (and tested) three times, |
96 |
| -once with `--cfg foo`, once with `--cfg bar`, and once with `--cfg |
97 |
| -baz`. You can therefore use `#[cfg(foo)]` etc within the test to tweak |
98 |
| -each of these results. |
99 |
| - |
100 |
| -You can also customize headers and expected error messages to a particular |
101 |
| -revision. To do this, add `[foo]` (or `bar`, `baz`, etc) after the `//` |
102 |
| -comment, like so: |
103 |
| - |
104 |
| -``` |
105 |
| -// A flag to pass in only for cfg `foo`: |
106 |
| -//[foo]compile-flags: -Z verbose |
107 |
| -
|
108 |
| -#[cfg(foo)] |
109 |
| -fn test_foo() { |
110 |
| - let x: usize = 32_u32; //[foo]~ ERROR mismatched types |
111 |
| -} |
112 |
| -``` |
113 |
| - |
114 |
| -Note that not all headers have meaning when customized to a revision. |
115 |
| -For example, the `ignore-test` header (and all "ignore" headers) |
116 |
| -currently only apply to the test as a whole, not to particular |
117 |
| -revisions. The only headers that are intended to really work when |
118 |
| -customized to a revision are error patterns and compiler flags. |
119 |
| - |
120 |
| -## Guide to the UI Tests |
121 |
| - |
122 |
| -The UI tests are intended to capture the compiler's complete output, |
123 |
| -so that we can test all aspects of the presentation. They work by |
124 |
| -compiling a file (e.g., `ui/hello_world/main.rs`), capturing the output, |
125 |
| -and then applying some normalization (see below). This normalized |
126 |
| -result is then compared against reference files named |
127 |
| -`ui/hello_world/main.stderr` and `ui/hello_world/main.stdout`. If either of |
128 |
| -those files doesn't exist, the output must be empty. If the test run |
129 |
| -fails, we will print out the current output, but it is also saved in |
130 |
| -`build/<target-triple>/test/ui/hello_world/main.stdout` (this path is |
131 |
| -printed as part of the test failure message), so you can run `diff` and |
132 |
| -so forth. |
133 |
| - |
134 |
| -Normally, the test-runner checks that UI tests fail compilation. If you want |
135 |
| -to do a UI test for code that *compiles* (e.g. to test warnings, or if you |
136 |
| -have a collection of tests, only some of which error out), you can use the |
137 |
| -`// compile-pass` header command to have the test runner instead |
138 |
| -check that the test compiles successfully. |
139 |
| - |
140 |
| -### Editing and updating the reference files |
141 |
| - |
142 |
| -If you have changed the compiler's output intentionally, or you are |
143 |
| -making a new test, you can pass `--bless` to the command you used to |
144 |
| -run the tests. This will then copy over the files |
145 |
| -from the build directory and use them as the new reference. |
146 |
| - |
147 |
| -### Normalization |
148 |
| - |
149 |
| -The normalization applied is aimed at eliminating output difference |
150 |
| -between platforms, mainly about filenames: |
151 |
| - |
152 |
| -- the test directory is replaced with `$DIR` |
153 |
| -- all backslashes (`\`) are converted to forward slashes (`/`) (for Windows) |
154 |
| -- all CR LF newlines are converted to LF |
155 |
| - |
156 |
| -Sometimes these built-in normalizations are not enough. In such cases, you |
157 |
| -may provide custom normalization rules using the header commands, e.g. |
158 |
| - |
159 |
| -``` |
160 |
| -// normalize-stdout-test: "foo" -> "bar" |
161 |
| -// normalize-stderr-32bit: "fn\(\) \(32 bits\)" -> "fn\(\) \($$PTR bits\)" |
162 |
| -// normalize-stderr-64bit: "fn\(\) \(64 bits\)" -> "fn\(\) \($$PTR bits\)" |
163 |
| -``` |
164 |
| - |
165 |
| -This tells the test, on 32-bit platforms, whenever the compiler writes |
166 |
| -`fn() (32 bits)` to stderr, it should be normalized to read `fn() ($PTR bits)` |
167 |
| -instead. Similar for 64-bit. The replacement is performed by regexes using |
168 |
| -default regex flavor provided by `regex` crate. |
169 |
| - |
170 |
| -The corresponding reference file will use the normalized output to test both |
171 |
| -32-bit and 64-bit platforms: |
172 |
| - |
173 |
| -``` |
174 |
| -... |
175 |
| - | |
176 |
| - = note: source type: fn() ($PTR bits) |
177 |
| - = note: target type: u16 (16 bits) |
178 |
| -... |
179 |
| -``` |
180 |
| - |
181 |
| -Please see `ui/transmute/main.rs` and `.stderr` for a concrete usage example. |
182 |
| - |
183 |
| -Besides `normalize-stderr-32bit` and `-64bit`, one may use any target |
184 |
| -information or stage supported by `ignore-X` here as well (e.g. |
185 |
| -`normalize-stderr-windows` or simply `normalize-stderr-test` for unconditional |
186 |
| -replacement). |
| 3 | +Documentation the compiler testing framework has moved to |
| 4 | +[the rustc guide](https://rust-lang-nursery.github.io/rustc-guide/tests/intro.html). |
0 commit comments