Skip to content

Commit a64911c

Browse files
committed
Rollup merge of rust-lang#52955 - tromey:compiler-test-docs, r=nikomatsakis
Update compiler test documentation Update the compiler test documentation to document ignore-gdb-version and min-system-llvm-version; and expand the min-gdb-version, min-lldb-version, and min-llvm-version documentation a little.
2 parents fa4dc7a + 8a76656 commit a64911c

File tree

1 file changed

+2
-184
lines changed

1 file changed

+2
-184
lines changed

src/test/COMPILER_TESTS.md

Lines changed: 2 additions & 184 deletions
Original file line numberDiff line numberDiff line change
@@ -1,186 +1,4 @@
11
# Compiler Test Documentation
22

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

Comments
 (0)