aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-resolve-path.cc6
-rw-r--r--gcc/rust/backend/rust-compile.cc6
-rw-r--r--gcc/rust/typecheck/rust-hir-path-probe.h50
-rw-r--r--gcc/rust/typecheck/rust-hir-trait-ref.h10
-rw-r--r--gcc/rust/typecheck/rust-hir-trait-resolve.h20
-rw-r--r--gcc/rust/typecheck/rust-hir-type-bounds.h5
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-base.h2
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h4
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-item.h14
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-type.h5
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check.h4
-rw-r--r--gcc/rust/typecheck/rust-tyty-bounds.cc20
-rw-r--r--gcc/rust/typecheck/rust-tyty.cc6
-rw-r--r--gcc/rust/typecheck/rust-tyty.h18
-rw-r--r--gcc/testsuite/rust/compile/traits7.rs24
15 files changed, 112 insertions, 82 deletions
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc
index 52bdbb0..5f07a2a 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -107,10 +107,10 @@ ResolvePathRef::visit (HIR::PathInExpression &expr)
= ctx->get_mappings ()->lookup_trait_item_mapping (
trait_item->get_mappings ().get_hirid ());
- Resolver::TraitReference &trait_ref
- = Resolver::TraitReference::error_node ();
+ Resolver::TraitReference *trait_ref
+ = &Resolver::TraitReference::error_node ();
bool ok = ctx->get_tyctx ()->lookup_trait_reference (
- trait->get_mappings ().get_defid (), trait_ref);
+ trait->get_mappings ().get_defid (), &trait_ref);
rust_assert (ok);
TyTy::BaseType *receiver = nullptr;
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index c93f08c..3c6a188 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -150,10 +150,10 @@ CompileExpr::visit (HIR::MethodCallExpr &expr)
HIR::Trait *trait = ctx->get_mappings ()->lookup_trait_item_mapping (
trait_item->get_mappings ().get_hirid ());
- Resolver::TraitReference &trait_ref
- = Resolver::TraitReference::error_node ();
+ Resolver::TraitReference *trait_ref
+ = &Resolver::TraitReference::error_node ();
bool ok = ctx->get_tyctx ()->lookup_trait_reference (
- trait->get_mappings ().get_defid (), trait_ref);
+ trait->get_mappings ().get_defid (), &trait_ref);
rust_assert (ok);
TyTy::BaseType *receiver = nullptr;
diff --git a/gcc/rust/typecheck/rust-hir-path-probe.h b/gcc/rust/typecheck/rust-hir-path-probe.h
index 8e3ca31..87c9662 100644
--- a/gcc/rust/typecheck/rust-hir-path-probe.h
+++ b/gcc/rust/typecheck/rust-hir-path-probe.h
@@ -49,8 +49,8 @@ struct PathProbeCandidate
struct TraitItemCandidate
{
- const TraitReference &trait_ref;
- const TraitItemReference &item_ref;
+ const TraitReference *trait_ref;
+ const TraitItemReference *item_ref;
};
CandidateType type;
@@ -128,18 +128,18 @@ public:
if (!probe_bounds)
return probe.candidates;
- std::vector<std::reference_wrapper<TraitReference>> probed_bounds
+ std::vector<TraitReference *> probed_bounds
= TypeBoundsProbe::Probe (receiver);
- std::vector<std::reference_wrapper<const TraitReference>> specified_bounds;
+ std::vector<const TraitReference *> specified_bounds;
for (const TyTy::TypeBoundPredicate &predicate :
receiver->get_specified_bounds ())
{
const TraitReference *trait_item = predicate.get ();
- specified_bounds.push_back (*trait_item);
+ specified_bounds.push_back (trait_item);
}
- std::vector<std::reference_wrapper<const TraitReference>> union_type_bounds
+ std::vector<const TraitReference *> union_type_bounds
= probe.union_bounds (probed_bounds, specified_bounds);
probe.process_traits_for_candidates (union_type_bounds,
ignore_mandatory_trait_items);
@@ -230,22 +230,22 @@ private:
}
void process_traits_for_candidates (
- const std::vector<std::reference_wrapper<const TraitReference>> traits,
+ const std::vector<const TraitReference *> traits,
bool ignore_mandatory_trait_items)
{
- for (const TraitReference &trait_ref : traits)
+ for (const TraitReference *trait_ref : traits)
{
- const TraitItemReference &trait_item_ref
- = trait_ref.lookup_trait_item (search.as_string ());
- if (trait_item_ref.is_error ())
+ const TraitItemReference *trait_item_ref = nullptr;
+ if (!trait_ref->lookup_trait_item (search.as_string (),
+ &trait_item_ref))
continue;
- bool trait_item_needs_implementation = !trait_item_ref.is_optional ();
+ bool trait_item_needs_implementation = !trait_item_ref->is_optional ();
if (ignore_mandatory_trait_items && trait_item_needs_implementation)
continue;
PathProbeCandidate::CandidateType candidate_type;
- switch (trait_item_ref.get_trait_item_type ())
+ switch (trait_item_ref->get_trait_item_type ())
{
case TraitItemReference::TraitItemType::FN:
candidate_type = PathProbeCandidate::CandidateType::TRAIT_FUNC;
@@ -264,7 +264,7 @@ private:
break;
}
- TyTy::BaseType *trait_item_tyty = trait_item_ref.get_tyty ();
+ TyTy::BaseType *trait_item_tyty = trait_item_ref->get_tyty ();
// we can substitute the Self with the receiver here
if (trait_item_tyty->get_kind () == TyTy::TypeKind::FNDEF)
@@ -298,7 +298,7 @@ private:
trait_ref, trait_item_ref};
PathProbeCandidate candidate{candidate_type,
trait_item_tyty,
- trait_ref.get_locus (),
+ trait_ref->get_locus (),
{trait_item_candidate}};
candidates.push_back (std::move (candidate));
}
@@ -311,21 +311,21 @@ private:
current_impl (nullptr)
{}
- std::vector<std::reference_wrapper<const TraitReference>> union_bounds (
- const std::vector<std::reference_wrapper</*const*/ TraitReference>> a,
- const std::vector<std::reference_wrapper<const TraitReference>> b) const
+ std::vector<const TraitReference *>
+ union_bounds (const std::vector</*const*/ TraitReference *> a,
+ const std::vector<const TraitReference *> b) const
{
- std::map<DefId, std::reference_wrapper<const TraitReference>> mapper;
- for (const TraitReference &ref : a)
+ std::map<DefId, const TraitReference *> mapper;
+ for (const TraitReference *ref : a)
{
- mapper.insert ({ref.get_mappings ().get_defid (), ref});
+ mapper.insert ({ref->get_mappings ().get_defid (), ref});
}
- for (const TraitReference &ref : b)
+ for (const TraitReference *ref : b)
{
- mapper.insert ({ref.get_mappings ().get_defid (), ref});
+ mapper.insert ({ref->get_mappings ().get_defid (), ref});
}
- std::vector<std::reference_wrapper<const TraitReference>> union_set;
+ std::vector<const TraitReference *> union_set;
for (auto it = mapper.begin (); it != mapper.end (); it++)
{
union_set.push_back (it->second);
@@ -362,7 +362,7 @@ public:
case PathProbeCandidate::CandidateType::TRAIT_ITEM_CONST:
case PathProbeCandidate::CandidateType::TRAIT_TYPE_ALIAS:
case PathProbeCandidate::CandidateType::TRAIT_FUNC:
- r.add_range (c.item.trait.item_ref.get_locus ());
+ r.add_range (c.item.trait.item_ref->get_locus ());
break;
}
}
diff --git a/gcc/rust/typecheck/rust-hir-trait-ref.h b/gcc/rust/typecheck/rust-hir-trait-ref.h
index dd77dfd..21a8beb 100644
--- a/gcc/rust/typecheck/rust-hir-trait-ref.h
+++ b/gcc/rust/typecheck/rust-hir-trait-ref.h
@@ -233,14 +233,18 @@ public:
return hir_trait_ref->get_mappings ();
}
- const TraitItemReference &lookup_trait_item (const std::string &ident) const
+ bool lookup_trait_item (const std::string &ident,
+ const TraitItemReference **ref) const
{
for (auto &item : item_refs)
{
if (ident.compare (item.get_identifier ()) == 0)
- return item;
+ {
+ *ref = &item;
+ return true;
+ }
}
- return TraitItemReference::error_node ();
+ return false;
}
const TraitItemReference &
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.h b/gcc/rust/typecheck/rust-hir-trait-resolve.h
index 1e69caa..1669a37 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.h
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.h
@@ -100,7 +100,7 @@ class TraitResolver : public TypeCheckBase
using Rust::Resolver::TypeCheckBase::visit;
public:
- static TraitReference &Resolve (HIR::TypePath &path)
+ static TraitReference *Resolve (HIR::TypePath &path)
{
TraitResolver resolver;
return resolver.go (path);
@@ -109,14 +109,14 @@ public:
private:
TraitResolver () : TypeCheckBase () {}
- TraitReference &go (HIR::TypePath &path)
+ TraitReference *go (HIR::TypePath &path)
{
NodeId ref;
if (!resolver->lookup_resolved_type (path.get_mappings ().get_nodeid (),
&ref))
{
rust_error_at (path.get_locus (), "Failed to resolve path to node-id");
- return TraitReference::error_node ();
+ return &TraitReference::error_node ();
}
HirId hir_node = UNKNOWN_HIRID;
@@ -124,7 +124,7 @@ private:
&hir_node))
{
rust_error_at (path.get_locus (), "Failed to resolve path to hir-id");
- return TraitReference::error_node ();
+ return &TraitReference::error_node ();
}
HIR::Item *resolved_item
@@ -134,9 +134,9 @@ private:
resolved_item->accept_vis (*this);
rust_assert (trait_reference != nullptr);
- TraitReference &tref = TraitReference::error_node ();
+ TraitReference *tref = &TraitReference::error_node ();
if (context->lookup_trait_reference (
- trait_reference->get_mappings ().get_defid (), tref))
+ trait_reference->get_mappings ().get_defid (), &tref))
{
return tref;
}
@@ -179,13 +179,13 @@ private:
item_refs.push_back (std::move (trait_item_ref));
}
- tref = TraitReference (trait_reference, item_refs);
+ TraitReference trait_object (trait_reference, item_refs);
context->insert_trait_reference (
- trait_reference->get_mappings ().get_defid (), std::move (tref));
+ trait_reference->get_mappings ().get_defid (), std::move (trait_object));
- tref = TraitReference::error_node ();
+ tref = &TraitReference::error_node ();
bool ok = context->lookup_trait_reference (
- trait_reference->get_mappings ().get_defid (), tref);
+ trait_reference->get_mappings ().get_defid (), &tref);
rust_assert (ok);
return tref;
diff --git a/gcc/rust/typecheck/rust-hir-type-bounds.h b/gcc/rust/typecheck/rust-hir-type-bounds.h
index d97c0f5..ce694da 100644
--- a/gcc/rust/typecheck/rust-hir-type-bounds.h
+++ b/gcc/rust/typecheck/rust-hir-type-bounds.h
@@ -31,8 +31,7 @@ class TypeBoundsProbe : public TypeCheckBase
using Rust::Resolver::TypeCheckBase::visit;
public:
- static std::vector<std::reference_wrapper<TraitReference>>
- Probe (const TyTy::BaseType *receiver)
+ static std::vector<TraitReference *> Probe (const TyTy::BaseType *receiver)
{
TypeBoundsProbe probe (receiver);
probe.scan ();
@@ -48,7 +47,7 @@ private:
{}
const TyTy::BaseType *receiver;
- std::vector<std::reference_wrapper<TraitReference>> trait_references;
+ std::vector<TraitReference *> trait_references;
};
} // namespace Resolver
diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.h b/gcc/rust/typecheck/rust-hir-type-check-base.h
index f05ab86..3dd0a19 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-base.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-base.h
@@ -202,7 +202,7 @@ protected:
context (TypeCheckContext::get ())
{}
- TraitReference &resolve_trait_path (HIR::TypePath &);
+ TraitReference *resolve_trait_path (HIR::TypePath &);
Analysis::Mappings *mappings;
Resolver *resolver;
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h
index 7f1a83d..6743c8b 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h
@@ -244,7 +244,7 @@ public:
= resolved_candidate.is_impl_candidate ()
? resolved_candidate.item.impl.impl_item->get_impl_mappings ()
.get_nodeid ()
- : resolved_candidate.item.trait.item_ref.get_mappings ()
+ : resolved_candidate.item.trait.item_ref->get_mappings ()
.get_nodeid ();
if (lookup_tyty->get_kind () != TyTy::TypeKind::FNDEF)
@@ -994,7 +994,7 @@ public:
else
{
resolved_node_id
- = candidate.item.trait.item_ref.get_mappings ().get_nodeid ();
+ = candidate.item.trait.item_ref->get_mappings ().get_nodeid ();
}
if (seg.has_generic_args ())
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.h b/gcc/rust/typecheck/rust-hir-type-check-item.h
index 493e91a..8775502 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.h
@@ -43,12 +43,12 @@ public:
void visit (HIR::ImplBlock &impl_block) override
{
- TraitReference &trait_reference = TraitReference::error_node ();
+ TraitReference *trait_reference = &TraitReference::error_node ();
if (impl_block.has_trait_ref ())
{
std::unique_ptr<HIR::TypePath> &ref = impl_block.get_trait_ref ();
trait_reference = TraitResolver::Resolve (*ref.get ());
- rust_assert (!trait_reference.is_error ());
+ rust_assert (!trait_reference->is_error ());
}
TyTy::BaseType *self = nullptr;
@@ -60,7 +60,7 @@ public:
return;
}
- bool is_trait_impl_block = !trait_reference.is_error ();
+ bool is_trait_impl_block = !trait_reference->is_error ();
std::vector<std::reference_wrapper<const TraitItemReference>>
trait_item_refs;
@@ -72,20 +72,20 @@ public:
{
auto &trait_item_ref
= TypeCheckImplItemWithTrait::Resolve (impl_item.get (), self,
- trait_reference);
+ *trait_reference);
trait_item_refs.push_back (trait_item_ref);
}
}
bool impl_block_missing_trait_items
= is_trait_impl_block
- && trait_reference.size () != trait_item_refs.size ();
+ && trait_reference->size () != trait_item_refs.size ();
if (impl_block_missing_trait_items)
{
// filter the missing impl_items
std::vector<std::reference_wrapper<const TraitItemReference>>
missing_trait_items;
- for (auto &trait_item_ref : trait_reference.get_trait_items ())
+ for (auto &trait_item_ref : trait_reference->get_trait_items ())
{
bool found = false;
for (const TraitItemReference &implemented_trait_item :
@@ -120,7 +120,7 @@ public:
rust_error_at (r, "missing %s in implementation of trait %<%s%>",
missing_items_buf.c_str (),
- trait_reference.get_name ().c_str ());
+ trait_reference->get_name ().c_str ());
}
}
}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.h b/gcc/rust/typecheck/rust-hir-type-check-type.h
index 91d9c53..ef1510e 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.h
@@ -280,8 +280,11 @@ public:
case HIR::TypeParamBound::BoundType::TRAITBOUND: {
HIR::TraitBound *b
= static_cast<HIR::TraitBound *> (bound.get ());
+
+ TraitReference *trait = resolve_trait_path (b->get_path ());
TyTy::TypeBoundPredicate predicate (
- &resolve_trait_path (b->get_path ()));
+ trait->get_mappings ().get_defid ());
+
specified_bounds.push_back (std::move (predicate));
}
break;
diff --git a/gcc/rust/typecheck/rust-hir-type-check.h b/gcc/rust/typecheck/rust-hir-type-check.h
index b171123..d834ad8 100644
--- a/gcc/rust/typecheck/rust-hir-type-check.h
+++ b/gcc/rust/typecheck/rust-hir-type-check.h
@@ -92,13 +92,13 @@ public:
trait_context.emplace (id, std::move (ref));
}
- bool lookup_trait_reference (DefId id, TraitReference &ref)
+ bool lookup_trait_reference (DefId id, TraitReference **ref)
{
auto it = trait_context.find (id);
if (it == trait_context.end ())
return false;
- ref = it->second;
+ *ref = &it->second;
return true;
}
diff --git a/gcc/rust/typecheck/rust-tyty-bounds.cc b/gcc/rust/typecheck/rust-tyty-bounds.cc
index a480155..3562e85 100644
--- a/gcc/rust/typecheck/rust-tyty-bounds.cc
+++ b/gcc/rust/typecheck/rust-tyty-bounds.cc
@@ -48,14 +48,14 @@ TypeBoundsProbe::scan ()
for (auto &trait_path : possible_trait_paths)
{
- TraitReference &trait_ref = TraitResolver::Resolve (*trait_path);
+ TraitReference *trait_ref = TraitResolver::Resolve (*trait_path);
- if (!trait_ref.is_error ())
+ if (!trait_ref->is_error ())
trait_references.push_back (trait_ref);
}
}
-TraitReference &
+TraitReference *
TypeCheckBase::resolve_trait_path (HIR::TypePath &path)
{
return TraitResolver::Resolve (path);
@@ -68,7 +68,19 @@ namespace TyTy {
std::string
TypeBoundPredicate::as_string () const
{
- return reference->as_string ();
+ return get ()->as_string ();
+}
+
+const Resolver::TraitReference *
+TypeBoundPredicate::get () const
+{
+ auto context = Resolver::TypeCheckContext::get ();
+
+ Resolver::TraitReference *ref = nullptr;
+ bool ok = context->lookup_trait_reference (reference, &ref);
+ rust_assert (ok);
+
+ return ref;
}
} // namespace TyTy
diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc
index 3238631..88b6c35 100644
--- a/gcc/rust/typecheck/rust-tyty.cc
+++ b/gcc/rust/typecheck/rust-tyty.cc
@@ -49,11 +49,11 @@ BaseType::satisfies_bound (const TypeBoundPredicate &predicate) const
return true;
}
- std::vector<std::reference_wrapper<Resolver::TraitReference>> probed
+ std::vector<Resolver::TraitReference *> probed
= Resolver::TypeBoundsProbe::Probe (this);
- for (const Resolver::TraitReference &bound : probed)
+ for (const Resolver::TraitReference *bound : probed)
{
- bool found = bound.get_mappings ().get_defid ()
+ bool found = bound->get_mappings ().get_defid ()
== query->get_mappings ().get_defid ();
if (found)
return true;
diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h
index 6fe67c7..f6f9579 100644
--- a/gcc/rust/typecheck/rust-tyty.h
+++ b/gcc/rust/typecheck/rust-tyty.h
@@ -132,26 +132,14 @@ public:
class TypeBoundPredicate
{
public:
- TypeBoundPredicate (Resolver::TraitReference *reference)
- : reference (reference)
- {}
-
- TypeBoundPredicate (const TypeBoundPredicate &other)
- : reference (other.reference)
- {}
-
- TypeBoundPredicate &operator= (const TypeBoundPredicate &other)
- {
- reference = other.reference;
- return *this;
- }
+ TypeBoundPredicate (DefId reference) : reference (reference) {}
std::string as_string () const;
- const Resolver::TraitReference *get () const { return reference; }
+ const Resolver::TraitReference *get () const;
private:
- Resolver::TraitReference *reference;
+ DefId reference;
};
class TypeBoundsMappings
diff --git a/gcc/testsuite/rust/compile/traits7.rs b/gcc/testsuite/rust/compile/traits7.rs
new file mode 100644
index 0000000..825553c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/traits7.rs
@@ -0,0 +1,24 @@
+trait Foo {
+ fn default() -> i32;
+}
+
+trait Bar {
+ fn not_default() -> i32;
+}
+
+struct Test(i32);
+
+impl Foo for Test {
+ fn default() -> i32 {
+ 1234
+ }
+}
+
+fn type_bound_test<T: Foo + Bar>() -> i32 {
+ T::default()
+}
+
+fn main() {
+ let a = type_bound_test::<Test>();
+ // { dg-error "bounds not satisfied for Test" "" { target *-*-* } .-1 }
+}