Skip to content

Commit

Permalink
lower: Correctly lower parenthesized types
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
CohenArthur committed Jan 3, 2025

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent de8606f commit 31d3f55
Showing 3 changed files with 48 additions and 0 deletions.
19 changes: 19 additions & 0 deletions gcc/rust/hir/rust-ast-lower-type.cc
Original file line number Diff line number Diff line change
@@ -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)
{
2 changes: 2 additions & 0 deletions gcc/rust/hir/rust-ast-lower-type.h
Original file line number Diff line number Diff line change
@@ -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 @@ class ASTLoweringType : public ASTLoweringBase
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)
27 changes: 27 additions & 0 deletions gcc/testsuite/rust/compile/auto_traits1.rs
Original file line number Diff line number Diff line change
@@ -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);
}

0 comments on commit 31d3f55

Please sign in to comment.