From: Philip Herron <herron.phi...@googlemail.com>

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.phi...@googlemail.com>
---
 gcc/rust/hir/rust-ast-lower-item.cc            |  4 ++--
 gcc/rust/typecheck/rust-hir-type-check-item.cc |  3 ++-
 gcc/testsuite/rust/compile/issue-3030.rs       | 16 ++++++++++++++++
 gcc/testsuite/rust/compile/nr2/exclude         |  1 +
 4 files changed, 21 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-3030.rs

diff --git a/gcc/rust/hir/rust-ast-lower-item.cc 
b/gcc/rust/hir/rust-ast-lower-item.cc
index 0ef4f357c8e..171737ab029 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 68e206924bb..d707e3458f1 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 00000000000..0a1866d9a6b
--- /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 ca07ed6ecd2..3251921acd4 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
-- 
2.45.2

Reply via email to