1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// trybuild UI tests: lock in the English wording and behavior of error messages.
//
// Run: `cargo test --test ui`
// Regenerate snapshots: `TRYBUILD=overwrite cargo test --test ui`
#[test]
fn ui() {
let t = trybuild::TestCases::new();
// core diagnostics from the README "error hints" table
t.compile_fail("tests/ui/only_semicolon.rs");
t.compile_fail("tests/ui/missing_colon.rs");
t.compile_fail("tests/ui/trait_path_no_ident.rs");
t.compile_fail("tests/ui/path_prefix_mismatch.rs");
// DSL semantic errors
t.compile_fail("tests/ui/num_as_left_operand.rs");
t.compile_fail("tests/ui/deep_nesting.rs");
// directive system errors
t.compile_fail("tests/ui/directive_bad_follow.rs");
t.compile_fail("tests/ui/fill_empty_args.rs");
t.compile_fail("tests/ui/fill_bad_comma.rs");
t.compile_fail("tests/ui/single_name_not_found.rs");
t.compile_fail("tests/ui/delegate_on_non_fn.rs");
// DSL semantic errors
t.compile_fail("tests/ui/empty_range.rs");
// trailing operators (missing operand after `-`/`^`)
t.compile_fail("tests/ui/dangling_operator.rs");
// operators/separators with an empty left side (`-A`/`^A`/`,A`/`A,,B`)
t.compile_fail("tests/ui/leading_operator.rs");
t.compile_fail("tests/ui/leading_comma.rs");
// `unsafe` juxtaposed with a non-fn type (should be unsafe^T or unsafe fn(...))
t.compile_fail("tests/ui/unsafe_non_fn.rs");
// directive argument list subtraction: `-` missing a target / empty after excluding everything
t.compile_fail("tests/ui/minus_bad_target.rs");
t.compile_fail("tests/ui/minus_empty.rs");
// generic auto-inheritance only accepts identical names: renaming / bound referencing undeclared params
t.compile_fail("tests/ui/rename_bound.rs");
t.compile_fail("tests/ui/rename_ref.rs");
// where predicate inheritance: renaming / composite predicates referencing undeclared params
t.compile_fail("tests/ui/rename_where.rs");
t.compile_fail("tests/ui/where_const_ref.rs");
// combined expansion count exceeds the limit
t.compile_fail("tests/ui/expand_limit.rs");
// bare where new syntax missing a code block
t.compile_fail("tests/ui/where_missing_body.rs");
// @ constant system: unknown constants / range endpoint errors / reference visibility (cycles / forward)
t.compile_fail("tests/ui/const_unknown.rs");
t.compile_fail("tests/ui/const_range_bad.rs");
t.compile_fail("tests/ui/const_cycle.rs");
t.compile_fail("tests/ui/const_forward.rs");
// a bare range endpoint (`@u8` without `..`) is not a constant — rejected
// at the definition by `check_value_refs`
t.compile_fail("tests/ui/const_bare_endpoint.rs");
t.compile_fail("tests/ui/at_group_out_of_range.rs");
t.compile_fail("tests/ui/top_level_block_not_last.rs");
t.compile_fail("tests/ui/top_level_manual_not_last.rs");
t.compile_fail("tests/ui/at_range_in_type.rs");
t.compile_fail("tests/ui/error_aggregation.rs");
t.compile_fail("tests/ui/top_level_without_attach.rs");
t.compile_fail("tests/ui/error_aggregation_codegen.rs");
t.compile_fail("tests/ui/group_angle_bare.rs");
t.compile_fail("tests/ui/const_reserved_all.rs");
t.compile_fail("tests/ui/blanket_bad_empty_depth.rs");
t.compile_fail("tests/ui/blanket_bad_huge_depth.rs");
t.compile_fail("tests/ui/nested_bracket_too_deep.rs");
t.compile_fail("tests/ui/const_value_deep_nesting.rs");
// #blanket: non-Deref wrappers / illegal `:N`
t.compile_fail("tests/ui/blanket_ptr.rs");
t.compile_fail("tests/ui/blanket_bad_depth.rs");
// @all generic-parameter families need trait_def (batch_trait! has none)
t.compile_fail("tests/ui/generic_family_batch_trait.rs");
// splat: a bare `*` that is neither a splat nor a raw pointer errors;
// a generator splat as a generic argument errors (fresh decl has nowhere to live)
t.compile_fail("tests/ui/star_misuse.rs");
t.compile_fail("tests/ui/where_splat_bad.rs");
// concrete-type args reject bindings/bounds (trait paths and generic
// declarations are their only valid homes)
t.compile_fail("tests/ui/concrete_binding.rs");
t.compile_fail("tests/ui/concrete_bound.rs");
// `;` / stray `=` / leftover `@` / `#` in a type position: the fallback
// primitive validates instead of rendering invalid Rust
t.compile_fail("tests/ui/semi_in_spec.rs");
// adjacent type fragments without an operator (`A B`) — same fallback
// catches them instead of rendering invalid Rust
t.compile_fail("tests/ui/adjacent_types.rs");
// fn types: trailing tokens after the parameter list error (a return
// type is `-> B` or `-B`; re-applying after `->` errors)
t.compile_fail("tests/ui/fn_return_reapply.rs");
// #blanket: a method returning `Self` cannot be blanket-delegated
// (forwarding yields the inner type, not the wrapper's `Self`)
t.compile_fail("tests/ui/blanket_self_return.rs");
// where-predicate inheritance: a projection subject (`T::Item: Clone`)
// references `T` — renaming the impl generic errors with guidance
t.compile_fail("tests/ui/rename_where_projection.rs");
// remaining silent-drop / raw-passthrough guards (see dev-changelog)
t.compile_fail("tests/ui/binding_bound_empty.rs");
t.compile_fail("tests/ui/literal_and_range.rs");
t.compile_fail("tests/ui/array_and_punct.rs");
t.compile_fail("tests/ui/directive_typo.rs");
// one path, ensuring normal cases are not broken
t.pass("tests/ui/pass/basic.rs");
}