Skip to content

Commit

Permalink
tychk: Add more support for additional trait bounds in functions
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
CohenArthur committed Jan 3, 2025
1 parent b15bae1 commit a8520d9
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 3 deletions.
6 changes: 6 additions & 0 deletions gcc/rust/resolve/rust-ast-resolve-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
3 changes: 3 additions & 0 deletions gcc/rust/resolve/rust-ast-resolve-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -143,6 +144,8 @@ class ResolveType : public ResolverBase

void visit (AST::TraitObjectType &type) override;

void visit (AST::ParenthesisedType &type) override;

void visit (AST::SliceType &type) override;

private:
Expand Down
6 changes: 6 additions & 0 deletions gcc/rust/typecheck/rust-hir-type-check-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
4 changes: 1 addition & 3 deletions gcc/rust/typecheck/rust-hir-type-check-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class TypeCheckType : public TypeCheckBase, public HIR::HIRTypeVisitor
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 */
Expand All @@ -69,9 +70,6 @@ class TypeCheckType : public TypeCheckBase, public HIR::HIRTypeVisitor
void visit (HIR::ImplTraitType &type) override
{ /* TODO */
}
void visit (HIR::ParenthesisedType &type) override
{ /* TODO */
}
void visit (HIR::ImplTraitTypeOneBound &type) override
{ /* TODO */
}
Expand Down
26 changes: 26 additions & 0 deletions gcc/testsuite/rust/compile/auto_traits2.rs
Original file line number Diff line number Diff line change
@@ -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 }
}
34 changes: 34 additions & 0 deletions gcc/testsuite/rust/compile/auto_traits3.rs
Original file line number Diff line number Diff line change
@@ -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);
}
2 changes: 2 additions & 0 deletions gcc/testsuite/rust/compile/nr2/exclude
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit a8520d9

Please sign in to comment.