diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-11-02 17:10:24 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-11-03 13:59:44 +0000 |
commit | 3dccdb1d6c57e983bed7135b4bc9ba7e1ae20fab (patch) | |
tree | 15f2996d46e49fb0982918629b98843f2f5af0a3 /gcc | |
parent | 5f0df4812c37fc428b5508e019e9fb7f8a7b77b1 (diff) | |
download | gcc-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.h | 9 | ||||
-rw-r--r-- | gcc/rust/backend/rust-compile-base.h | 1 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-type.h | 2 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower.cc | 38 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-full-decls.h | 1 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-full-test.cc | 25 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-type.h | 58 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-visitor.h | 1 | ||||
-rw-r--r-- | gcc/rust/lint/rust-lint-marklive-base.h | 1 | ||||
-rw-r--r-- | gcc/rust/parse/rust-parse-impl.h | 10 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-type.h | 2 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 11 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-const-fold-base.h | 1 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-base.h | 1 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-type.cc | 29 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-type.h | 2 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-util.h | 1 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/traits10.rs | 1 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/traits11.rs | 1 |
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 } } |