From 53dfc6acf966284a86826141c8f364c1732d3d3d Mon Sep 17 00:00:00 2001 From: Arthur Cohen Date: Thu, 16 Jan 2025 17:10:02 +0100 Subject: [PATCH] typecheck: Add basic handling for applying auto trait bounds gcc/rust/ChangeLog: * hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): Register auto traits in mappings. * util/rust-hir-map.cc (Mappings::insert_auto_trait): New. (Mappings::get_auto_traits): New. * util/rust-hir-map.h: Declare them. * typecheck/rust-tyty-bounds.cc (TypeBoundsProbe::scan): Add auto trait bounds when scanning. gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: Some parts of nr2.0 can't handle auto traits yet. * rust/compile/auto_traits3.rs: Removed in favor of... * rust/compile/auto_traits2.rs: ...this one. * rust/compile/auto_traits4.rs: New test. --- gcc/rust/hir/rust-ast-lower-item.cc | 11 +++---- gcc/rust/typecheck/rust-tyty-bounds.cc | 4 +++ gcc/rust/util/rust-hir-map.cc | 12 ++++++++ gcc/rust/util/rust-hir-map.h | 6 ++++ gcc/testsuite/rust/compile/auto_traits2.rs | 5 ++-- gcc/testsuite/rust/compile/auto_traits3.rs | 34 ---------------------- gcc/testsuite/rust/compile/auto_traits4.rs | 14 +++++++++ gcc/testsuite/rust/compile/nr2/exclude | 3 +- 8 files changed, 46 insertions(+), 43 deletions(-) delete mode 100644 gcc/testsuite/rust/compile/auto_traits3.rs create mode 100644 gcc/testsuite/rust/compile/auto_traits4.rs diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc index 2457e919aa47..4094891dced6 100644 --- a/gcc/rust/hir/rust-ast-lower-item.cc +++ b/gcc/rust/hir/rust-ast-lower-item.cc @@ -606,17 +606,18 @@ ASTLoweringItem::visit (AST::Trait &trait) mappings.get_next_hir_id (crate_num), mappings.get_next_localdef_id (crate_num)); - auto trait_unsafety = Unsafety::Normal; - if (trait.is_unsafe ()) - { - trait_unsafety = Unsafety::Unsafe; - } + auto trait_unsafety + = trait.is_unsafe () ? Unsafety::Unsafe : Unsafety::Normal; HIR::Trait *hir_trait = new HIR::Trait (mapping, trait.get_identifier (), trait_unsafety, std::move (generic_params), std::move (type_param_bounds), where_clause, std::move (trait_items), vis, trait.get_outer_attrs (), trait.get_locus ()); + + if (trait.is_auto ()) + mappings.insert_auto_trait (hir_trait); + translated = hir_trait; for (auto trait_item_id : trait_item_ids) diff --git a/gcc/rust/typecheck/rust-tyty-bounds.cc b/gcc/rust/typecheck/rust-tyty-bounds.cc index 5d65b94150ca..1d25d4a71355 100644 --- a/gcc/rust/typecheck/rust-tyty-bounds.cc +++ b/gcc/rust/typecheck/rust-tyty-bounds.cc @@ -97,6 +97,10 @@ TypeBoundsProbe::scan () // marker traits... assemble_sized_builtin (); + + // add auto trait bounds + for (auto *auto_trait : mappings.get_auto_traits ()) + add_trait_bound (auto_trait); } void diff --git a/gcc/rust/util/rust-hir-map.cc b/gcc/rust/util/rust-hir-map.cc index bf09c94543e6..26e3ee134c14 100644 --- a/gcc/rust/util/rust-hir-map.cc +++ b/gcc/rust/util/rust-hir-map.cc @@ -1309,5 +1309,17 @@ Mappings::get_lang_item_node (LangItem::Kind item_type) LangItem::ToString (item_type).c_str ()); } +void +Mappings::insert_auto_trait (HIR::Trait *trait) +{ + auto_traits.emplace_back (trait); +} + +std::vector & +Mappings::get_auto_traits () +{ + return auto_traits; +} + } // namespace Analysis } // namespace Rust diff --git a/gcc/rust/util/rust-hir-map.h b/gcc/rust/util/rust-hir-map.h index 9cf977a2b691..177894de9f85 100644 --- a/gcc/rust/util/rust-hir-map.h +++ b/gcc/rust/util/rust-hir-map.h @@ -342,6 +342,9 @@ class Mappings tl::optional lookup_trait_item_lang_item (LangItem::Kind item, location_t locus); + void insert_auto_trait (HIR::Trait *trait); + std::vector &get_auto_traits (); + private: Mappings (); @@ -380,6 +383,9 @@ class Mappings std::map hirTraitItemsToTraitMappings; std::map hirPatternMappings; + // FIXME: Add documentation + std::vector auto_traits; + // We need to have two maps here, as lang-items need to be used for both AST // passes and HIR passes. Thus those two maps are created at different times. std::map lang_item_mappings; diff --git a/gcc/testsuite/rust/compile/auto_traits2.rs b/gcc/testsuite/rust/compile/auto_traits2.rs index 7d0dcc11cd2a..382d44608113 100644 --- a/gcc/testsuite/rust/compile/auto_traits2.rs +++ b/gcc/testsuite/rust/compile/auto_traits2.rs @@ -15,12 +15,11 @@ fn foo(a: &(dyn A + Send + Sync)) { struct S; impl A for S { - fn a_method(&self) {} + fn a_method(&self) {} // { dg-warning "unused name" } } fn main() { let s = S; - foo(&s); // { dg-error "bounds not satisfied" } - // { dg-error "mismatched type" "" { target *-*-* } .-1 } + foo(&s); } diff --git a/gcc/testsuite/rust/compile/auto_traits3.rs b/gcc/testsuite/rust/compile/auto_traits3.rs deleted file mode 100644 index 81c39ecda7f4..000000000000 --- a/gcc/testsuite/rust/compile/auto_traits3.rs +++ /dev/null @@ -1,34 +0,0 @@ -#![feature(optin_builtin_traits)] - -pub unsafe auto trait Send {} -#[lang = "sync"] -pub unsafe auto trait Sync {} - -trait A { - fn a_method(&self) {} -} - -fn foo(a: &(dyn A + Send + Sync)) { - a.a_method(); -} - -struct S; - -impl A for S { - fn a_method(&self) {} // { dg-warning "unused" } -} - -// These should not be necessary because they are both auto traits -// They need to be removed once we figure out the proper implementation for each of them -// However, it'd be silly to implement other traits in order to ensure the test is okay, -// as these extra trait bounds are only allowed to use auto traits -// FIXME: #3327 -// FIXME: #3326 -unsafe impl Send for S {} -unsafe impl Sync for S {} - -fn main() { - let s = S; - - foo(&s); -} diff --git a/gcc/testsuite/rust/compile/auto_traits4.rs b/gcc/testsuite/rust/compile/auto_traits4.rs new file mode 100644 index 000000000000..f1cd1e4dd16d --- /dev/null +++ b/gcc/testsuite/rust/compile/auto_traits4.rs @@ -0,0 +1,14 @@ +#![feature(optin_builtin_traits)] + +unsafe auto trait Send {} +unsafe auto trait Sync {} + +fn take_send(_: &dyn Send) {} +fn take_sync(_: &dyn Sync) {} + +fn main() { + let a = i32; + + take_send(&a); + take_sync(&a); +} diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude index 60322f3276a9..a8e3ba56e611 100644 --- a/gcc/testsuite/rust/compile/nr2/exclude +++ b/gcc/testsuite/rust/compile/nr2/exclude @@ -140,7 +140,8 @@ issue-2907.rs issue-2423.rs issue-266.rs additional-trait-bounds2.rs -auto_traits3.rs +auto_traits2.rs +auto_traits4.rs issue-3140.rs cmp1.rs derive_clone_enum1.rs