aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2024-09-20 17:49:36 +0100
committerCohenArthur <arthur.cohen@embecosm.com>2024-09-20 18:32:10 +0000
commit39eb3a44122ece56c88699b6262869910dd8dbcc (patch)
tree0a57183ebddf4689d3eca35bf870483934b91ebb /gcc
parent5d703a35cae07de269119ad0eed3f1f7a4726046 (diff)
downloadgcc-39eb3a44122ece56c88699b6262869910dd8dbcc.zip
gcc-39eb3a44122ece56c88699b6262869910dd8dbcc.tar.gz
gcc-39eb3a44122ece56c88699b6262869910dd8dbcc.tar.bz2
rust: negative polarity removes restrictions on validation of impl blocks
Negative polarity means we can just ignore if any trait items are not implemented. Fxies #3030 gcc/rust/ChangeLog: * hir/rust-ast-lower-item.cc (ASTLoweringItem::visit): the polarity was reversed * typecheck/rust-hir-type-check-item.cc: check the polarity gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: nr2 cant handle this * rust/compile/issue-3030.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.cc4
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-item.cc3
-rw-r--r--gcc/testsuite/rust/compile/issue-3030.rs16
-rw-r--r--gcc/testsuite/rust/compile/nr2/exclude1
4 files changed, 21 insertions, 3 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-item.cc b/gcc/rust/hir/rust-ast-lower-item.cc
index f3ad72c..cb07b26 100644
--- a/gcc/rust/hir/rust-ast-lower-item.cc
+++ b/gcc/rust/hir/rust-ast-lower-item.cc
@@ -690,8 +690,8 @@ ASTLoweringItem::visit (AST::TraitImpl &impl_block)
}
BoundPolarity polarity = impl_block.is_exclam ()
- ? BoundPolarity::RegularBound
- : BoundPolarity::NegativeBound;
+ ? BoundPolarity::NegativeBound
+ : BoundPolarity::RegularBound;
HIR::ImplBlock *hir_impl_block = new HIR::ImplBlock (
mapping, std::move (impl_items), std::move (generic_params),
std::unique_ptr<HIR::Type> (impl_type),
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc b/gcc/rust/typecheck/rust-hir-type-check-item.cc
index 669a482..c1e8107 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc
@@ -734,7 +734,8 @@ TypeCheckItem::validate_trait_impl_block (
bool impl_block_missing_trait_items
= !specified_bound.is_error ()
&& trait_reference->size () != trait_item_refs.size ();
- if (impl_block_missing_trait_items)
+ if (impl_block_missing_trait_items
+ && impl_block.get_polarity () == BoundPolarity::RegularBound)
{
// filter the missing impl_items
std::vector<std::reference_wrapper<const TraitItemReference>>
diff --git a/gcc/testsuite/rust/compile/issue-3030.rs b/gcc/testsuite/rust/compile/issue-3030.rs
new file mode 100644
index 0000000..0a1866d
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3030.rs
@@ -0,0 +1,16 @@
+#![feature(negative_impls)]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+pub trait Deref {}
+
+pub trait DerefMut: Deref {
+ type Target;
+
+ /// Mutably dereferences the value.
+ #[stable(feature = "rust1", since = "1.0.0")]
+ fn deref_mut(&mut self) -> &mut Self::Target;
+}
+
+impl<T: ?Sized> !DerefMut for &T {}
diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude
index ca07ed6..3251921 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -291,3 +291,4 @@ unknown-associated-item.rs
box_syntax_feature_gate.rs
dropck_eyepatch_feature_gate.rs
inline_asm_parse_output_operand.rs
+issue-3030.rs \ No newline at end of file