aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-11-02 17:10:24 +0000
committerPhilip Herron <philip.herron@embecosm.com>2021-11-03 13:59:44 +0000
commit3dccdb1d6c57e983bed7135b4bc9ba7e1ae20fab (patch)
tree15f2996d46e49fb0982918629b98843f2f5af0a3 /gcc
parent5f0df4812c37fc428b5508e019e9fb7f8a7b77b1 (diff)
downloadgcc-3dccdb1d6c57e983bed7135b4bc9ba7e1ae20fab.zip
gcc-3dccdb1d6c57e983bed7135b4bc9ba7e1ae20fab.tar.gz
gcc-3dccdb1d6c57e983bed7135b4bc9ba7e1ae20fab.tar.bz2
Desugar AST::TraitObjectTypeOneBound
We have two ways to represent TraitObjectType's: - AST::TraitObjectType - AST::TraitObjectTypeOneBound This desugars this within HIR into a single HIR::TraitObjectType which contains a list of bounds. Addresses #786
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-type.h9
-rw-r--r--gcc/rust/backend/rust-compile-base.h1
-rw-r--r--gcc/rust/hir/rust-ast-lower-type.h2
-rw-r--r--gcc/rust/hir/rust-ast-lower.cc38
-rw-r--r--gcc/rust/hir/tree/rust-hir-full-decls.h1
-rw-r--r--gcc/rust/hir/tree/rust-hir-full-test.cc25
-rw-r--r--gcc/rust/hir/tree/rust-hir-type.h58
-rw-r--r--gcc/rust/hir/tree/rust-hir-visitor.h1
-rw-r--r--gcc/rust/lint/rust-lint-marklive-base.h1
-rw-r--r--gcc/rust/parse/rust-parse-impl.h10
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.h2
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc11
-rw-r--r--gcc/rust/typecheck/rust-hir-const-fold-base.h1
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-base.h1
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-type.cc29
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-type.h2
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-util.h1
-rw-r--r--gcc/testsuite/rust/compile/traits10.rs1
-rw-r--r--gcc/testsuite/rust/compile/traits11.rs1
19 files changed, 86 insertions, 109 deletions
diff --git a/gcc/rust/ast/rust-type.h b/gcc/rust/ast/rust-type.h
index b38837c..2414b60 100644
--- a/gcc/rust/ast/rust-type.h
+++ b/gcc/rust/ast/rust-type.h
@@ -162,10 +162,7 @@ public:
class TraitObjectType : public Type
{
bool has_dyn;
- // TypeParamBounds type_param_bounds;
- std::vector<std::unique_ptr<TypeParamBound> >
- type_param_bounds; // inlined form
-
+ std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds;
Location locus;
protected:
@@ -179,7 +176,7 @@ protected:
public:
TraitObjectType (
std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds,
- Location locus, bool is_dyn_dispatch = false)
+ Location locus, bool is_dyn_dispatch)
: has_dyn (is_dyn_dispatch),
type_param_bounds (std::move (type_param_bounds)), locus (locus)
{}
@@ -215,6 +212,8 @@ public:
void accept_vis (ASTVisitor &vis) override;
+ bool is_dyn () const { return has_dyn; }
+
// TODO: mutable getter seems kinda dodgy
std::vector<std::unique_ptr<TypeParamBound> > &get_type_param_bounds ()
{
diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h
index d741598..87ac6cc 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -177,7 +177,6 @@ public:
virtual void visit (HIR::TraitObjectType &type) {}
virtual void visit (HIR::ParenthesisedType &type) {}
virtual void visit (HIR::ImplTraitTypeOneBound &type) {}
- virtual void visit (HIR::TraitObjectTypeOneBound &type) {}
virtual void visit (HIR::TupleType &type) {}
virtual void visit (HIR::NeverType &type) {}
virtual void visit (HIR::RawPointerType &type) {}
diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h
index c667932..858984c 100644
--- a/gcc/rust/hir/rust-ast-lower-type.h
+++ b/gcc/rust/hir/rust-ast-lower-type.h
@@ -293,6 +293,8 @@ public:
void visit (AST::TraitObjectTypeOneBound &type) override;
+ void visit (AST::TraitObjectType &type) override;
+
private:
ASTLoweringType () : ASTLoweringBase (), translated (nullptr) {}
diff --git a/gcc/rust/hir/rust-ast-lower.cc b/gcc/rust/hir/rust-ast-lower.cc
index 5f269b1..d8d53eb 100644
--- a/gcc/rust/hir/rust-ast-lower.cc
+++ b/gcc/rust/hir/rust-ast-lower.cc
@@ -517,21 +517,43 @@ ASTLowerQualifiedPathInType::visit (AST::QualifiedPathInType &path)
void
ASTLoweringType::visit (AST::TraitObjectTypeOneBound &type)
{
- HIR::TypeParamBound *b
+ std::vector<std::unique_ptr<HIR::TypeParamBound> > bounds;
+ HIR::TypeParamBound *translated_bound
= ASTLoweringTypeBounds::translate (&type.get_trait_bound ());
- rust_assert (b->get_bound_type () == HIR::TypeParamBound::TRAITBOUND);
- HIR::TraitBound *bb = static_cast<HIR::TraitBound *> (b);
- HIR::TraitBound bound (*bb);
- delete bb;
+ bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (translated_bound));
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));
- translated
- = new HIR::TraitObjectTypeOneBound (mapping, std::move (bound),
- type.get_locus (), type.is_dyn ());
+ translated = new HIR::TraitObjectType (mapping, std::move (bounds),
+ type.get_locus (), type.is_dyn ());
+
+ mappings->insert_hir_type (mapping.get_crate_num (), mapping.get_hirid (),
+ translated);
+}
+
+void
+ASTLoweringType::visit (AST::TraitObjectType &type)
+{
+ std::vector<std::unique_ptr<HIR::TypeParamBound> > bounds;
+
+ for (auto &bound : type.get_type_param_bounds ())
+ {
+ HIR::TypeParamBound *translated_bound
+ = ASTLoweringTypeBounds::translate (bound.get ());
+ bounds.push_back (
+ std::unique_ptr<HIR::TypeParamBound> (translated_bound));
+ }
+
+ 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));
+
+ translated = new HIR::TraitObjectType (mapping, std::move (bounds),
+ type.get_locus (), type.is_dyn ());
mappings->insert_hir_type (mapping.get_crate_num (), mapping.get_hirid (),
translated);
diff --git a/gcc/rust/hir/tree/rust-hir-full-decls.h b/gcc/rust/hir/tree/rust-hir-full-decls.h
index 384ddf5..3e9d8b2 100644
--- a/gcc/rust/hir/tree/rust-hir-full-decls.h
+++ b/gcc/rust/hir/tree/rust-hir-full-decls.h
@@ -218,7 +218,6 @@ class ImplTraitType;
class TraitObjectType;
class ParenthesisedType;
class ImplTraitTypeOneBound;
-class TraitObjectTypeOneBound;
class TupleType;
class NeverType;
class RawPointerType;
diff --git a/gcc/rust/hir/tree/rust-hir-full-test.cc b/gcc/rust/hir/tree/rust-hir-full-test.cc
index a7c2e9f9..bacef82 100644
--- a/gcc/rust/hir/tree/rust-hir-full-test.cc
+++ b/gcc/rust/hir/tree/rust-hir-full-test.cc
@@ -2893,25 +2893,6 @@ TypePathSegmentGeneric::as_string () const
}
std::string
-TraitObjectTypeOneBound::as_string () const
-{
- std::string str ("TraitObjectTypeOneBound: \n Has dyn dispatch: ");
-
- if (has_dyn)
- {
- str += "true";
- }
- else
- {
- str += "false";
- }
-
- str += "\n TraitBound: " + trait_bound.as_string ();
-
- return str;
-}
-
-std::string
TypePathFunction::as_string () const
{
std::string str ("(");
@@ -4462,12 +4443,6 @@ ImplTraitTypeOneBound::accept_vis (HIRVisitor &vis)
}
void
-TraitObjectTypeOneBound::accept_vis (HIRVisitor &vis)
-{
- vis.visit (*this);
-}
-
-void
TupleType::accept_vis (HIRVisitor &vis)
{
vis.visit (*this);
diff --git a/gcc/rust/hir/tree/rust-hir-type.h b/gcc/rust/hir/tree/rust-hir-type.h
index 1a90b29..070b761 100644
--- a/gcc/rust/hir/tree/rust-hir-type.h
+++ b/gcc/rust/hir/tree/rust-hir-type.h
@@ -145,10 +145,7 @@ public:
class TraitObjectType : public Type
{
bool has_dyn;
- // TypeParamBounds type_param_bounds;
- std::vector<std::unique_ptr<TypeParamBound> >
- type_param_bounds; // inlined form
-
+ std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds;
Location locus;
protected:
@@ -163,7 +160,7 @@ public:
TraitObjectType (
Analysis::NodeMapping mappings,
std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds,
- Location locus, bool is_dyn_dispatch = false)
+ Location locus, bool is_dyn_dispatch)
: Type (mappings), has_dyn (is_dyn_dispatch),
type_param_bounds (std::move (type_param_bounds)), locus (locus)
{}
@@ -199,6 +196,17 @@ public:
Location get_locus () const { return locus; }
void accept_vis (HIRVisitor &vis) override;
+
+ std::vector<std::unique_ptr<TypeParamBound> > &get_type_param_bounds ()
+ {
+ return type_param_bounds;
+ }
+
+ const std::vector<std::unique_ptr<TypeParamBound> > &
+ get_type_param_bounds () const
+ {
+ return type_param_bounds;
+ }
};
// A type with parentheses around it, used to avoid ambiguity.
@@ -305,46 +313,6 @@ public:
void accept_vis (HIRVisitor &vis) override;
};
-/* A trait object with a single trait bound. The "trait bound" is really just
- * the trait. Basically like using an interface as a type in an OOP language. */
-class TraitObjectTypeOneBound : public TypeNoBounds
-{
- bool has_dyn;
- TraitBound trait_bound;
- Location locus;
-
-protected:
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- TraitObjectTypeOneBound *clone_type_impl () const override
- {
- return new TraitObjectTypeOneBound (mappings, trait_bound, locus, has_dyn);
- }
-
- /* Use covariance to implement clone function as returning this object rather
- * than base */
- TraitObjectTypeOneBound *clone_type_no_bounds_impl () const override
- {
- return new TraitObjectTypeOneBound (mappings, trait_bound, locus, has_dyn);
- }
-
-public:
- TraitObjectTypeOneBound (Analysis::NodeMapping mappings,
- TraitBound trait_bound, Location locus,
- bool is_dyn_dispatch)
- : TypeNoBounds (mappings), has_dyn (is_dyn_dispatch),
- trait_bound (std::move (trait_bound)), locus (locus)
- {}
-
- std::string as_string () const override;
-
- Location get_locus () const { return locus; }
-
- void accept_vis (HIRVisitor &vis) override;
-
- TraitBound &get_trait_bound () { return trait_bound; }
-};
-
class TypePath; // definition moved to "rust-path.h"
/* A type consisting of the "product" of others (the tuple's elements) in a
diff --git a/gcc/rust/hir/tree/rust-hir-visitor.h b/gcc/rust/hir/tree/rust-hir-visitor.h
index 96ea4c3..0487446 100644
--- a/gcc/rust/hir/tree/rust-hir-visitor.h
+++ b/gcc/rust/hir/tree/rust-hir-visitor.h
@@ -149,7 +149,6 @@ public:
virtual void visit (TraitObjectType &type) = 0;
virtual void visit (ParenthesisedType &type) = 0;
virtual void visit (ImplTraitTypeOneBound &type) = 0;
- virtual void visit (TraitObjectTypeOneBound &type) = 0;
virtual void visit (TupleType &type) = 0;
virtual void visit (NeverType &type) = 0;
virtual void visit (RawPointerType &type) = 0;
diff --git a/gcc/rust/lint/rust-lint-marklive-base.h b/gcc/rust/lint/rust-lint-marklive-base.h
index e7b0194..b67705b 100644
--- a/gcc/rust/lint/rust-lint-marklive-base.h
+++ b/gcc/rust/lint/rust-lint-marklive-base.h
@@ -172,7 +172,6 @@ public:
virtual void visit (HIR::TraitObjectType &) override {}
virtual void visit (HIR::ParenthesisedType &) override {}
virtual void visit (HIR::ImplTraitTypeOneBound &) override {}
- virtual void visit (HIR::TraitObjectTypeOneBound &) override {}
virtual void visit (HIR::TupleType &) override {}
virtual void visit (HIR::NeverType &) override {}
virtual void visit (HIR::RawPointerType &) override {}
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 52aba4f..316933e 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -9061,7 +9061,8 @@ Parser<ManagedTokenSource>::parse_type ()
= parse_type_param_bounds ();
return std::unique_ptr<AST::TraitObjectType> (
- new AST::TraitObjectType (std::move (bounds), t->get_locus ()));
+ new AST::TraitObjectType (std::move (bounds), t->get_locus (),
+ false));
}
case IDENTIFIER:
case SUPER:
@@ -9148,7 +9149,7 @@ Parser<ManagedTokenSource>::parse_type ()
}
return std::unique_ptr<AST::TraitObjectType> (
- new AST::TraitObjectType (std::move (bounds), locus));
+ new AST::TraitObjectType (std::move (bounds), locus, false));
}
default:
// assume that this is a type path and not an error
@@ -9418,7 +9419,8 @@ Parser<ManagedTokenSource>::parse_paren_prefixed_type ()
}
return std::unique_ptr<AST::TraitObjectType> (
- new AST::TraitObjectType (std::move (bounds), left_delim_locus));
+ new AST::TraitObjectType (std::move (bounds), left_delim_locus,
+ false));
}
else
{
@@ -9528,7 +9530,7 @@ Parser<ManagedTokenSource>::parse_for_prefixed_type ()
}
return std::unique_ptr<AST::TraitObjectType> (
- new AST::TraitObjectType (std::move (bounds), for_locus));
+ new AST::TraitObjectType (std::move (bounds), for_locus, false));
}
default:
// error
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h
index 4708bff..838d173 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.h
+++ b/gcc/rust/resolve/rust-ast-resolve-type.h
@@ -371,6 +371,8 @@ public:
void visit (AST::TraitObjectTypeOneBound &type) override;
+ void visit (AST::TraitObjectType &type) override;
+
private:
ResolveType (NodeId parent, bool canonicalize_type_with_generics)
: ResolverBase (parent),
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc
index 83a15a8..af04aeb 100644
--- a/gcc/rust/resolve/rust-ast-resolve.cc
+++ b/gcc/rust/resolve/rust-ast-resolve.cc
@@ -726,6 +726,17 @@ ResolveType::visit (AST::TraitObjectTypeOneBound &type)
ok = bound_resolved_id != UNKNOWN_NODEID;
}
+void
+ResolveType::visit (AST::TraitObjectType &type)
+{
+ ok = true;
+ for (auto &bound : type.get_type_param_bounds ())
+ {
+ /* NodeId bound_resolved_id = */
+ ResolveTypeBound::go (bound.get (), type.get_node_id ());
+ }
+}
+
// rust-ast-resolve-item.h
void
diff --git a/gcc/rust/typecheck/rust-hir-const-fold-base.h b/gcc/rust/typecheck/rust-hir-const-fold-base.h
index 77c68c8..9cbf1ab 100644
--- a/gcc/rust/typecheck/rust-hir-const-fold-base.h
+++ b/gcc/rust/typecheck/rust-hir-const-fold-base.h
@@ -175,7 +175,6 @@ public:
virtual void visit (HIR::TraitObjectType &) override {}
virtual void visit (HIR::ParenthesisedType &) override {}
virtual void visit (HIR::ImplTraitTypeOneBound &) override {}
- virtual void visit (HIR::TraitObjectTypeOneBound &) override {}
virtual void visit (HIR::TupleType &) override {}
virtual void visit (HIR::NeverType &) override {}
virtual void visit (HIR::RawPointerType &) override {}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.h b/gcc/rust/typecheck/rust-hir-type-check-base.h
index b1e1050..eb96fd1 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-base.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-base.h
@@ -177,7 +177,6 @@ public:
virtual void visit (HIR::TraitObjectType &) override {}
virtual void visit (HIR::ParenthesisedType &) override {}
virtual void visit (HIR::ImplTraitTypeOneBound &) override {}
- virtual void visit (HIR::TraitObjectTypeOneBound &) override {}
virtual void visit (HIR::TupleType &) override {}
virtual void visit (HIR::NeverType &) override {}
virtual void visit (HIR::RawPointerType &) override {}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index f2d5fe7..ee2ffe1 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -525,22 +525,27 @@ TypeCheckType::resolve_segments (
}
void
-TypeCheckType::visit (HIR::TraitObjectTypeOneBound &type)
+TypeCheckType::visit (HIR::TraitObjectType &type)
{
std::vector<TyTy::TypeBoundPredicate> specified_bounds;
-
- HIR::TraitBound &trait_bound = type.get_trait_bound ();
- TraitReference *trait = resolve_trait_path (trait_bound.get_path ());
- TyTy::TypeBoundPredicate predicate (trait->get_mappings ().get_defid (),
- trait_bound.get_locus ());
-
- if (predicate.is_object_safe (true, type.get_locus ()))
+ for (auto &bound : type.get_type_param_bounds ())
{
- specified_bounds.push_back (std::move (predicate));
- translated
- = new TyTy::DynamicObjectType (type.get_mappings ().get_hirid (),
- std::move (specified_bounds));
+ if (bound->get_bound_type ()
+ != HIR::TypeParamBound::BoundType::TRAITBOUND)
+ continue;
+
+ HIR::TypeParamBound &b = *bound.get ();
+ HIR::TraitBound &trait_bound = static_cast<HIR::TraitBound &> (b);
+ TraitReference *trait = resolve_trait_path (trait_bound.get_path ());
+ TyTy::TypeBoundPredicate predicate (trait->get_mappings ().get_defid (),
+ trait_bound.get_locus ());
+
+ if (predicate.is_object_safe (true, type.get_locus ()))
+ specified_bounds.push_back (std::move (predicate));
}
+
+ translated = new TyTy::DynamicObjectType (type.get_mappings ().get_hirid (),
+ std::move (specified_bounds));
}
} // namespace Resolver
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.h b/gcc/rust/typecheck/rust-hir-type-check-type.h
index c2b6d7c..1f7f71d 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.h
@@ -147,7 +147,7 @@ public:
TyTy::InferType::InferTypeKind::GENERAL);
}
- void visit (HIR::TraitObjectTypeOneBound &type) override;
+ void visit (HIR::TraitObjectType &type) override;
private:
TypeCheckType (std::vector<TyTy::SubstitutionParamMapping> *subst_mappings)
diff --git a/gcc/rust/typecheck/rust-hir-type-check-util.h b/gcc/rust/typecheck/rust-hir-type-check-util.h
index 78d35a6..4595ca3 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-util.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-util.h
@@ -170,7 +170,6 @@ public:
virtual void visit (HIR::TraitObjectType &) override {}
virtual void visit (HIR::ParenthesisedType &) override {}
virtual void visit (HIR::ImplTraitTypeOneBound &) override {}
- virtual void visit (HIR::TraitObjectTypeOneBound &) override {}
virtual void visit (HIR::TupleType &) override {}
virtual void visit (HIR::NeverType &) override {}
virtual void visit (HIR::RawPointerType &) override {}
diff --git a/gcc/testsuite/rust/compile/traits10.rs b/gcc/testsuite/rust/compile/traits10.rs
index a4622b2..f8f551b 100644
--- a/gcc/testsuite/rust/compile/traits10.rs
+++ b/gcc/testsuite/rust/compile/traits10.rs
@@ -12,5 +12,4 @@ pub fn main() {
let b: &dyn Bar = &a;
// { dg-error "trait bound is not object safe" "" { target *-*-* } .-1 }
- // { dg-error "expected" "" { target *-*-* } .-2 }
}
diff --git a/gcc/testsuite/rust/compile/traits11.rs b/gcc/testsuite/rust/compile/traits11.rs
index bf69ff0..d06e47d 100644
--- a/gcc/testsuite/rust/compile/traits11.rs
+++ b/gcc/testsuite/rust/compile/traits11.rs
@@ -16,5 +16,4 @@ pub fn main() {
let b: &dyn B = &a;
// { dg-error "trait bound is not object safe" "" { target *-*-* } .-1 }
- // { dg-error "expected" "" { target *-*-* } .-2 }
}