]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: tychk: Add more support for additional trait bounds in functions
authorArthur Cohen <arthur.cohen@embecosm.com>
Wed, 25 Dec 2024 18:13:43 +0000 (18:13 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Fri, 21 Mar 2025 11:55:44 +0000 (12:55 +0100)
This commit correctly lowers and typechecks parenthesized types, which are used for trait objects with additional bounds.

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-type.cc (ResolveType::visit): New visitor to handle
ParenthesizedType.
* resolve/rust-ast-resolve-type.h: Likewise.
* typecheck/rust-hir-type-check-type.cc (TypeCheckType::visit): Likewise.
* typecheck/rust-hir-type-check-type.h: Likewise.

gcc/testsuite/ChangeLog:

* rust/compile/auto_traits2.rs: New test.
* rust/compile/auto_traits3.rs: New test.
* rust/compile/nr2/exclude: Add auto_traits2 test.

gcc/rust/resolve/rust-ast-resolve-type.cc
gcc/rust/resolve/rust-ast-resolve-type.h
gcc/rust/typecheck/rust-hir-type-check-type.cc
gcc/rust/typecheck/rust-hir-type-check-type.h
gcc/testsuite/rust/compile/auto_traits2.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/auto_traits3.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/nr2/exclude

index cb5a18d5d477646bc069ef39c684b4338d1dab2b..1d004b1ba9bba42bf2e41008c35fe34b54c06274 100644 (file)
@@ -50,6 +50,12 @@ ResolveType::visit (AST::TraitObjectType &type)
     }
 }
 
+void
+ResolveType::visit (AST::ParenthesisedType &type)
+{
+  resolved_node = ResolveType::go (*type.get_type_in_parens ());
+}
+
 void
 ResolveType::visit (AST::ReferenceType &type)
 {
index 518c0d80b14d15e8c52b9ec58fb935df05e6dc1d..5e8cdb11b2d78d254bf6e57d44d10a755d13566b 100644 (file)
@@ -24,6 +24,7 @@
 #include "rust-diagnostics.h"
 #include "rust-hir-map.h"
 #include "rust-path.h"
+#include "rust-type.h"
 #include "util/rust-hir-map.h"
 
 namespace Rust {
@@ -143,6 +144,8 @@ public:
 
   void visit (AST::TraitObjectType &type) override;
 
+  void visit (AST::ParenthesisedType &type) override;
+
   void visit (AST::SliceType &type) override;
 
 private:
index 4ea1a493fa802efa52e734159f1c81726778e300..859cdfedcd0bd13596f69d922ce233bb18fd4543 100644 (file)
@@ -790,6 +790,12 @@ TypeCheckType::visit (HIR::TraitObjectType &type)
                                   std::move (specified_bounds));
 }
 
+void
+TypeCheckType::visit (HIR::ParenthesisedType &type)
+{
+  translated = TypeCheckType::Resolve (type.get_type_in_parens ());
+}
+
 void
 TypeCheckType::visit (HIR::ArrayType &type)
 {
index bf5589cbbabd679bb08b90a8f644312e807a2df7..1da01b869ddcbbbb4f7f1739d223814e43d05d3b 100644 (file)
@@ -59,6 +59,7 @@ public:
   void visit (HIR::InferredType &type) override;
   void visit (HIR::NeverType &type) override;
   void visit (HIR::TraitObjectType &type) override;
+  void visit (HIR::ParenthesisedType &type) override;
 
   void visit (HIR::TypePathSegmentFunction &segment) override
   { /* TODO */
@@ -69,9 +70,6 @@ public:
   void visit (HIR::ImplTraitType &type) override
   { /* TODO */
   }
-  void visit (HIR::ParenthesisedType &type) override
-  { /* TODO */
-  }
   void visit (HIR::ImplTraitTypeOneBound &type) override
   { /* TODO */
   }
diff --git a/gcc/testsuite/rust/compile/auto_traits2.rs b/gcc/testsuite/rust/compile/auto_traits2.rs
new file mode 100644 (file)
index 0000000..7d0dcc1
--- /dev/null
@@ -0,0 +1,26 @@
+#![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) {}
+}
+
+fn main() {
+    let s = S;
+
+    foo(&s); // { dg-error "bounds not satisfied" }
+             // { dg-error "mismatched type" "" { target *-*-* } .-1 }
+}
diff --git a/gcc/testsuite/rust/compile/auto_traits3.rs b/gcc/testsuite/rust/compile/auto_traits3.rs
new file mode 100644 (file)
index 0000000..81c39ec
--- /dev/null
@@ -0,0 +1,34 @@
+#![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);
+}
index 2a5bc94b6463aa9c34cb2fcdb40d91ee9c0fc807..e23669f309b4d805849f301d08f877a671f30e9d 100644 (file)
@@ -207,4 +207,6 @@ issue-2907.rs
 issue-2423.rs
 issue-266.rs
 additional-trait-bounds2.rs
+auto_traits2.rs
+auto_traits3.rs
 # please don't delete the trailing newline