mirror of https://github.com/rust-lang/rust
72 lines
2.7 KiB
Rust
72 lines
2.7 KiB
Rust
// Regression test for issue #97933.
|
|
//
|
|
// Test that certain unevaluated constant expressions that are
|
|
// deemed too verbose or complex and that may leak private or
|
|
// `doc(hidden)` struct fields are not displayed in the documentation.
|
|
//
|
|
// Read the documentation of `rustdoc::clean::utils::print_const_expr`
|
|
// for further details.
|
|
|
|
//@ has hide_complex_unevaluated_consts/trait.Container.html
|
|
pub trait Container {
|
|
// A helper constant that prevents const expressions containing it
|
|
// from getting fully evaluated since it doesn't have a body and
|
|
// thus is non-reducible. This allows us to specifically test the
|
|
// pretty-printing of *unevaluated* consts.
|
|
const ABSTRACT: i32;
|
|
|
|
// Ensure that the private field does not get leaked:
|
|
//
|
|
//@ has - '//*[@id="associatedconstant.STRUCT0"]' \
|
|
// 'const STRUCT0: Struct = _'
|
|
const STRUCT0: Struct = Struct { private: () };
|
|
|
|
//@ has - '//*[@id="associatedconstant.STRUCT1"]' \
|
|
// 'const STRUCT1: (Struct,) = _'
|
|
const STRUCT1: (Struct,) = (Struct{private: /**/()},);
|
|
|
|
// Although the struct field is public here, check that it is not
|
|
// displayed. In a future version of rustdoc, we definitely want to
|
|
// show it. However for the time being, the printing logic is a bit
|
|
// conservative.
|
|
//
|
|
//@ has - '//*[@id="associatedconstant.STRUCT2"]' \
|
|
// 'const STRUCT2: Record = _'
|
|
const STRUCT2: Record = Record { public: 5 };
|
|
|
|
// Test that we do not show the incredibly verbose match expr:
|
|
//
|
|
//@ has - '//*[@id="associatedconstant.MATCH0"]' \
|
|
// 'const MATCH0: i32 = _'
|
|
const MATCH0: i32 = match 234 {
|
|
0 => 1,
|
|
_ => Self::ABSTRACT,
|
|
};
|
|
|
|
//@ has - '//*[@id="associatedconstant.MATCH1"]' \
|
|
// 'const MATCH1: bool = _'
|
|
const MATCH1: bool = match Self::ABSTRACT {
|
|
_ => true,
|
|
};
|
|
|
|
// Check that we hide complex (arithmetic) operations.
|
|
// In this case, it is a bit unfortunate since the expression
|
|
// is not *that* verbose and it might be quite useful to the reader.
|
|
//
|
|
// However in general, the expression might be quite large and
|
|
// contain match expressions and structs with private fields.
|
|
// We would need to recurse over the whole expression and even more
|
|
// importantly respect operator precedence when pretty-printing
|
|
// the potentially partially censored expression.
|
|
// For now, the implementation is quite simple and the choices
|
|
// rather conservative.
|
|
//
|
|
//@ has - '//*[@id="associatedconstant.ARITH_OPS"]' \
|
|
// 'const ARITH_OPS: i32 = _'
|
|
const ARITH_OPS: i32 = Self::ABSTRACT * 2 + 1;
|
|
}
|
|
|
|
pub struct Struct { private: () }
|
|
|
|
pub struct Record { pub public: i32 }
|