]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: lower: Correctly lower parenthesized types
authorArthur Cohen <arthur.cohen@embecosm.com>
Wed, 25 Dec 2024 17:55:09 +0000 (17:55 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Fri, 21 Mar 2025 11:55:44 +0000 (12:55 +0100)
This is useful for handling multiple trait bounds, and required for better handling of auto traits.

gcc/rust/ChangeLog:

* hir/rust-ast-lower-type.cc (ASTLoweringType::visit): Add implementation for
ParenthesizedType.
* hir/rust-ast-lower-type.h: Declare that new visitor.

gcc/testsuite/ChangeLog:

* rust/compile/auto_traits1.rs: New test.

gcc/rust/hir/rust-ast-lower-type.cc
gcc/rust/hir/rust-ast-lower-type.h
gcc/testsuite/rust/compile/auto_traits1.rs [new file with mode: 0644]

index df06e48b801d6ddd1cb74e9fdb849103dc8bf218..d1f95edc34561fc7296f30e4febc8f54014b093e 100644 (file)
@@ -19,6 +19,7 @@
 #include "rust-ast-lower-type.h"
 #include "rust-hir-map.h"
 #include "rust-hir-path.h"
+#include "rust-hir-type.h"
 #include "rust-path.h"
 #include "rust-pattern.h"
 
@@ -471,6 +472,24 @@ ASTLoweringType::visit (AST::TraitObjectType &type)
                                         type.get_locus (), type.is_dyn ());
 }
 
+void
+ASTLoweringType::visit (AST::ParenthesisedType &type)
+{
+  auto *inner = ASTLoweringType::translate (*type.get_type_in_parens (),
+                                           default_to_static_lifetime);
+
+  auto crate_num = mappings.get_current_crate ();
+  Analysis::NodeMapping mapping (crate_num, type.get_node_id (),
+                                mappings.get_next_hir_id (crate_num),
+                                mappings.get_next_localdef_id (crate_num));
+
+  // FIXME: Do we actually need to know if a type is parenthesized in the HIR?
+  // or can we just use the type in parens?
+  translated
+    = new HIR::ParenthesisedType (mapping, std::unique_ptr<HIR::Type> (inner),
+                                 type.get_locus ());
+}
+
 HIR::GenericParam *
 ASTLowerGenericParam::translate (AST::GenericParam &param)
 {
index 0429e3fcf986e3ab1da84741f9eef3d5edd4f78e..26ca8684083cf244ba9450af1906ea71baf111c9 100644 (file)
@@ -22,6 +22,7 @@
 #include "rust-ast-lower-base.h"
 #include "rust-ast-lower-expr.h"
 #include "rust-hir-path.h"
+#include "rust-type.h"
 
 namespace Rust {
 namespace HIR {
@@ -83,6 +84,7 @@ public:
   void visit (AST::NeverType &type) override;
   void visit (AST::TraitObjectTypeOneBound &type) override;
   void visit (AST::TraitObjectType &type) override;
+  void visit (AST::ParenthesisedType &type) override;
 
 private:
   ASTLoweringType (bool default_to_static_lifetime)
diff --git a/gcc/testsuite/rust/compile/auto_traits1.rs b/gcc/testsuite/rust/compile/auto_traits1.rs
new file mode 100644 (file)
index 0000000..192052d
--- /dev/null
@@ -0,0 +1,27 @@
+// { dg-additional-options "-frust-compile-until=typecheck" }
+
+#![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);
+}