Skip to content

Rollup of 7 pull requests #110919

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 20 commits into from
Apr 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
cd398a6
test that we format the panic message only once
Apr 23, 2023
89566d5
configure --set support list as arguments
chenyukang Mar 28, 2023
d8faf3e
add test
chenyukang Mar 28, 2023
589877c
Fix help message of option for checking List
chenyukang Apr 19, 2023
787f3fe
fix bug in set args
chenyukang Apr 26, 2023
907daec
refactor(docs): remove macro resolution fallback
bvanjoi Apr 27, 2023
9156b03
test(doc): no fallback marco resolution
bvanjoi Apr 27, 2023
bdb956e
nits
BoxyUwU Apr 27, 2023
94c8551
Remove unused std::sys_common::thread_local_key::Key.
m-ou-se Apr 27, 2023
0b3073a
Update test.
m-ou-se Apr 27, 2023
1b390f4
Skip rustc version detection on macOS
john-h-k Apr 27, 2023
b56d85d
Document `const {}` syntax for `std::thread_local`.
Noratrieb Apr 20, 2023
cffc10b
Comment round #1
john-h-k Apr 27, 2023
6b0da57
Rollup merge of #109702 - chenyukang:yukang/fix-109316-configure, r=a…
JohnTitor Apr 28, 2023
085fbe9
Rollup merge of #110620 - Nilstrieb:document-the-undocumented, r=thomcc
JohnTitor Apr 28, 2023
eea5f8a
Rollup merge of #110721 - lukas-code:panic-fmt, r=Amanieu
JohnTitor Apr 28, 2023
0246af8
Rollup merge of #110881 - bvanjoi:fix-110879, r=jyn514
JohnTitor Apr 28, 2023
c464be9
Rollup merge of #110893 - BoxyUwU:inline_const_nits, r=compiler-errors
JohnTitor Apr 28, 2023
75be558
Rollup merge of #110898 - m-ou-se:remove-unused-thread-local-key, r=c…
JohnTitor Apr 28, 2023
00b9ce5
Rollup merge of #110909 - john-h-k:build/no-rustc-version-darwin, r=j…
JohnTitor Apr 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions compiler/rustc_hir_typeck/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,6 @@ fn typeck_with_fallback<'tcx>(
}))
} else if let Node::AnonConst(_) = node {
match tcx.hir().get(tcx.hir().parent_id(id)) {
Node::Expr(&hir::Expr {
kind: hir::ExprKind::ConstBlock(ref anon_const), ..
}) if anon_const.hir_id == id => Some(fcx.next_ty_var(TypeVariableOrigin {
kind: TypeVariableOriginKind::TypeInference,
span,
})),
Node::Ty(&hir::Ty { kind: hir::TyKind::Typeof(ref anon_const), .. })
if anon_const.hir_id == id =>
{
Expand Down
61 changes: 0 additions & 61 deletions library/std/src/sys_common/thread_local_key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,31 +87,6 @@ pub struct StaticKey {
dtor: Option<unsafe extern "C" fn(*mut u8)>,
}

/// A type for a safely managed OS-based TLS slot.
///
/// This type allocates an OS TLS key when it is initialized and will deallocate
/// the key when it falls out of scope. When compared with `StaticKey`, this
/// type is entirely safe to use.
///
/// Implementations will likely, however, contain unsafe code as this type only
/// operates on `*mut u8`, a raw pointer.
///
/// # Examples
///
/// ```ignore (cannot-doctest-private-modules)
/// use tls::os::Key;
///
/// let key = Key::new(None);
/// assert!(key.get().is_null());
/// key.set(1 as *mut u8);
/// assert!(!key.get().is_null());
///
/// drop(key); // deallocate this TLS slot.
/// ```
pub struct Key {
key: imp::Key,
}

/// Constant initialization value for static TLS keys.
///
/// This value specifies no destructor by default.
Expand Down Expand Up @@ -194,39 +169,3 @@ impl StaticKey {
}
}
}

impl Key {
/// Creates a new managed OS TLS key.
///
/// This key will be deallocated when the key falls out of scope.
///
/// The argument provided is an optionally-specified destructor for the
/// value of this TLS key. When a thread exits and the value for this key
/// is non-null the destructor will be invoked. The TLS value will be reset
/// to null before the destructor is invoked.
///
/// Note that the destructor will not be run when the `Key` goes out of
/// scope.
#[inline]
pub fn new(dtor: Option<unsafe extern "C" fn(*mut u8)>) -> Key {
Key { key: unsafe { imp::create(dtor) } }
}

/// See StaticKey::get
#[inline]
pub fn get(&self) -> *mut u8 {
unsafe { imp::get(self.key) }
}

/// See StaticKey::set
#[inline]
pub fn set(&self, val: *mut u8) {
unsafe { imp::set(self.key, val) }
}
}

impl Drop for Key {
fn drop(&mut self) {
unsafe { imp::destroy(self.key) }
}
}
20 changes: 1 addition & 19 deletions library/std/src/sys_common/thread_local_key/tests.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,6 @@
use super::{Key, StaticKey};
use super::StaticKey;
use core::ptr;

fn assert_sync<T: Sync>() {}
fn assert_send<T: Send>() {}

#[test]
fn smoke() {
assert_sync::<Key>();
assert_send::<Key>();

let k1 = Key::new(None);
let k2 = Key::new(None);
assert!(k1.get().is_null());
assert!(k2.get().is_null());
k1.set(ptr::invalid_mut(1));
k2.set(ptr::invalid_mut(2));
assert_eq!(k1.get() as usize, 1);
assert_eq!(k2.get() as usize, 2);
}

#[test]
fn statik() {
static K1: StaticKey = StaticKey::new(None);
Expand Down
22 changes: 20 additions & 2 deletions library/std/src/thread/local.rs
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,28 @@ impl<T: 'static> fmt::Debug for LocalKey<T> {
/// thread_local! {
/// pub static FOO: RefCell<u32> = RefCell::new(1);
///
/// #[allow(unused)]
/// static BAR: RefCell<f32> = RefCell::new(1.0);
/// }
/// # fn main() {}
///
/// FOO.with(|foo| assert_eq!(*foo.borrow(), 1));
/// BAR.with(|bar| assert_eq!(*bar.borrow(), 1.0));
/// ```
///
/// This macro supports a special `const {}` syntax that can be used
/// when the initialization expression can be evaluated as a constant.
/// This can enable a more efficient thread local implementation that
/// can avoid lazy initialization. For types that do not
/// [need to be dropped][crate::mem::needs_drop], this can enable an
/// even more efficient implementation that does not need to
/// track any additional state.
///
/// ```
/// use std::cell::Cell;
/// thread_local! {
/// pub static FOO: Cell<u32> = const { Cell::new(1) };
/// }
///
/// FOO.with(|foo| assert_eq!(foo.get(), 1));
/// ```
///
/// See [`LocalKey` documentation][`std::thread::LocalKey`] for more
Expand Down
28 changes: 17 additions & 11 deletions src/bootstrap/bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,19 +209,25 @@ def default_build_triple(verbose):
# install, use their preference. This fixes most issues with Windows builds
# being detected as GNU instead of MSVC.
default_encoding = sys.getdefaultencoding()
try:
version = subprocess.check_output(["rustc", "--version", "--verbose"],
stderr=subprocess.DEVNULL)
version = version.decode(default_encoding)
host = next(x for x in version.split('\n') if x.startswith("host: "))
triple = host.split("host: ")[1]
if verbose:
print("detected default triple {} from pre-installed rustc".format(triple))
return triple
except Exception as e:

if sys.platform == 'darwin':
if verbose:
print("pre-installed rustc not detected: {}".format(e))
print("not using rustc detection as it is unreliable on macOS")
print("falling back to auto-detect")
else:
try:
version = subprocess.check_output(["rustc", "--version", "--verbose"],
stderr=subprocess.DEVNULL)
version = version.decode(default_encoding)
host = next(x for x in version.split('\n') if x.startswith("host: "))
triple = host.split("host: ")[1]
if verbose:
print("detected default triple {} from pre-installed rustc".format(triple))
return triple
except Exception as e:
if verbose:
print("pre-installed rustc not detected: {}".format(e))
print("falling back to auto-detect")

required = sys.platform != 'win32'
ostype = require(["uname", "-s"], exit=required)
Expand Down
8 changes: 8 additions & 0 deletions src/bootstrap/bootstrap_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ def test_set_top_level(self):
build = self.serialize_and_parse(["--set", "profile=compiler"])
self.assertEqual(build.get_toml("profile"), 'compiler')

def test_set_codegen_backends(self):
build = self.serialize_and_parse(["--set", "rust.codegen-backends=cranelift"])
self.assertNotEqual(build.config_toml.find("codegen-backends = ['cranelift']"), -1)
build = self.serialize_and_parse(["--set", "rust.codegen-backends=cranelift,llvm"])
self.assertNotEqual(build.config_toml.find("codegen-backends = ['cranelift', 'llvm']"), -1)
build = self.serialize_and_parse(["--enable-full-tools"])
self.assertNotEqual(build.config_toml.find("codegen-backends = ['llvm']"), -1)

if __name__ == '__main__':
SUITE = unittest.TestSuite()
TEST_LOADER = unittest.TestLoader()
Expand Down
14 changes: 10 additions & 4 deletions src/bootstrap/configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,7 @@ def v(*args):
"experimental LLVM targets to build")
v("release-channel", "rust.channel", "the name of the release channel to build")
v("release-description", "rust.description", "optional descriptive string for version output")
v("dist-compression-formats", None,
"comma-separated list of compression formats to use")
v("dist-compression-formats", None, "List of compression formats to use")

# Used on systems where "cc" is unavailable
v("default-linker", "rust.default-linker", "the default linker")
Expand All @@ -168,8 +167,8 @@ def v(*args):
v("tools", None, "List of extended tools will be installed")
v("codegen-backends", None, "List of codegen backends to build")
v("build", "build.build", "GNUs ./configure syntax LLVM build triple")
v("host", None, "GNUs ./configure syntax LLVM host triples")
v("target", None, "GNUs ./configure syntax LLVM target triples")
v("host", None, "List of GNUs ./configure syntax LLVM host triples")
v("target", None, "List of GNUs ./configure syntax LLVM target triples")

v("set", None, "set arbitrary key/value pairs in TOML configuration")

Expand All @@ -182,6 +181,11 @@ def err(msg):
print("configure: error: " + msg)
sys.exit(1)

def is_value_list(key):
for option in options:
if option.name == key and option.desc.startswith('List of'):
return True
return False

if '--help' in sys.argv or '-h' in sys.argv:
print('Usage: ./configure [options]')
Expand Down Expand Up @@ -295,6 +299,8 @@ def set(key, value, config):
parts = key.split('.')
for i, part in enumerate(parts):
if i == len(parts) - 1:
if is_value_list(part) and isinstance(value, str):
value = value.split(',')
arr[part] = value
else:
if part not in arr:
Expand Down
30 changes: 16 additions & 14 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1295,7 +1295,8 @@ impl LinkCollector<'_, '_> {
}
}
}
resolution_failure(self, diag, path_str, disambiguator, smallvec![err])
resolution_failure(self, diag, path_str, disambiguator, smallvec![err]);
return vec![];
}
}
}
Expand Down Expand Up @@ -1331,13 +1332,14 @@ impl LinkCollector<'_, '_> {
.fold(0, |acc, res| if let Ok(res) = res { acc + res.len() } else { acc });

if len == 0 {
return resolution_failure(
resolution_failure(
self,
diag,
path_str,
disambiguator,
candidates.into_iter().filter_map(|res| res.err()).collect(),
);
return vec![];
} else if len == 1 {
candidates.into_iter().filter_map(|res| res.ok()).flatten().collect::<Vec<_>>()
} else {
Expand Down Expand Up @@ -1642,9 +1644,8 @@ fn resolution_failure(
path_str: &str,
disambiguator: Option<Disambiguator>,
kinds: SmallVec<[ResolutionFailure<'_>; 3]>,
) -> Vec<(Res, Option<DefId>)> {
) {
let tcx = collector.cx.tcx;
let mut recovered_res = None;
report_diagnostic(
tcx,
BROKEN_INTRA_DOC_LINKS,
Expand Down Expand Up @@ -1736,19 +1737,25 @@ fn resolution_failure(

if !path_str.contains("::") {
if disambiguator.map_or(true, |d| d.ns() == MacroNS)
&& let Some(&res) = collector.cx.tcx.resolutions(()).all_macro_rules
.get(&Symbol::intern(path_str))
&& collector
.cx
.tcx
.resolutions(())
.all_macro_rules
.get(&Symbol::intern(path_str))
.is_some()
{
diag.note(format!(
"`macro_rules` named `{path_str}` exists in this crate, \
but it is not in scope at this link's location"
));
recovered_res = res.try_into().ok().map(|res| (res, None));
} else {
// If the link has `::` in it, assume it was meant to be an
// intra-doc link. Otherwise, the `[]` might be unrelated.
diag.help("to escape `[` and `]` characters, \
add '\\' before them like `\\[` or `\\]`");
diag.help(
"to escape `[` and `]` characters, \
add '\\' before them like `\\[` or `\\]`",
);
}
}

Expand Down Expand Up @@ -1854,11 +1861,6 @@ fn resolution_failure(
}
},
);

match recovered_res {
Some(r) => vec![r],
None => Vec::new(),
}
}

fn report_multiple_anchors(cx: &DocContext<'_>, diag_info: DiagnosticInfo<'_>) {
Expand Down
14 changes: 14 additions & 0 deletions tests/rustdoc/issue-106142.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// @has 'issue_106142/a/index.html'
// @count 'issue_106142/a/index.html' '//ul[@class="item-table"]//li//a' 1

#![allow(rustdoc::broken_intra_doc_links)]

pub mod a {
/// [`m`]
pub fn f() {}

#[macro_export]
macro_rules! m {
() => {};
}
}
21 changes: 21 additions & 0 deletions tests/ui/panics/fmt-only-once.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// run-fail
// check-run-results
// exec-env:RUST_BACKTRACE=0

// Test that we format the panic message only once.
// Regression test for https://github.com/rust-lang/rust/issues/110717

use std::fmt;

struct PrintOnFmt;

impl fmt::Display for PrintOnFmt {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
eprintln!("fmt");
f.write_str("PrintOnFmt")
}
}

fn main() {
panic!("{}", PrintOnFmt)
}
3 changes: 3 additions & 0 deletions tests/ui/panics/fmt-only-once.run.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
fmt
thread 'main' panicked at 'PrintOnFmt', $DIR/fmt-only-once.rs:20:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace