diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-09-10 14:21:43 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-10 14:21:43 +0000 |
commit | 2bf19c1b20bfad19136e17c0c7fa765e161b789c (patch) | |
tree | 9921253c39d493c64aa3218de4965f12ff20e022 /gcc | |
parent | c0254d7efe135ca3de755504a1f042010ee45786 (diff) | |
parent | a1c87bfea6c5e2fd6b2d23b12b563fcaf5ec09a1 (diff) | |
download | gcc-2bf19c1b20bfad19136e17c0c7fa765e161b789c.zip gcc-2bf19c1b20bfad19136e17c0c7fa765e161b789c.tar.gz gcc-2bf19c1b20bfad19136e17c0c7fa765e161b789c.tar.bz2 |
Merge #666
666: Super Traits Support r=philberty a=philberty
This adds initial super traits support. Super traits are implemented by
explicitly adding the super trait bound to the implicit Self type parameter
on traits. This will improve as we enhance the type system to handle bounds
and where constraints in general as they reuse all that same code path.
Fixes #565
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 143 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.h | 36 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.cc | 12 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/traits16.rs | 20 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/torture/traits17.rs | 23 | ||||
-rw-r--r-- | gcc/testsuite/rust/execute/torture/trait3.rs | 43 |
7 files changed, 207 insertions, 73 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index 35b1c64..936e11f 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -40,7 +40,7 @@ class TypeParam : public GenericParam // bool has_type_param_bounds; // TypeParamBounds type_param_bounds; - std::vector<std::unique_ptr<TypeParamBound> > + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds; // inlined form // bool has_type; @@ -60,8 +60,8 @@ public: TypeParam (Analysis::NodeMapping mappings, Identifier type_representation, Location locus = Location (), - std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds - = std::vector<std::unique_ptr<TypeParamBound> > (), + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds + = std::vector<std::unique_ptr<TypeParamBound>> (), std::unique_ptr<Type> type = nullptr, AST::Attribute outer_attr = AST::Attribute::create_empty ()) : GenericParam (mappings), outer_attr (std::move (outer_attr)), @@ -122,7 +122,7 @@ public: return type->get_mappings (); } - std::vector<std::unique_ptr<TypeParamBound> > &get_type_param_bounds () + std::vector<std::unique_ptr<TypeParamBound>> &get_type_param_bounds () { return type_param_bounds; } @@ -197,7 +197,7 @@ class TypeBoundWhereClauseItem : public WhereClauseItem // bool has_type_param_bounds; // TypeParamBounds type_param_bounds; - std::vector<std::unique_ptr<TypeParamBound> > + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds; // inlined form // should this store location info? @@ -211,7 +211,7 @@ public: TypeBoundWhereClauseItem ( std::vector<LifetimeParam> for_lifetimes, std::unique_ptr<Type> bound_type, - std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds) + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds) : for_lifetimes (std::move (for_lifetimes)), bound_type (std::move (bound_type)), type_param_bounds (std::move (type_param_bounds)) @@ -261,13 +261,12 @@ protected: struct WhereClause { private: - std::vector<std::unique_ptr<WhereClauseItem> > where_clause_items; + std::vector<std::unique_ptr<WhereClauseItem>> where_clause_items; // should this store location info? public: - WhereClause ( - std::vector<std::unique_ptr<WhereClauseItem> > where_clause_items) + WhereClause (std::vector<std::unique_ptr<WhereClauseItem>> where_clause_items) : where_clause_items (std::move (where_clause_items)) {} @@ -296,7 +295,7 @@ public: // Creates a WhereClause with no items. static WhereClause create_empty () { - return WhereClause (std::vector<std::unique_ptr<WhereClauseItem> > ()); + return WhereClause (std::vector<std::unique_ptr<WhereClauseItem>> ()); } // Returns whether the WhereClause has no items. @@ -645,7 +644,7 @@ class Module : public VisItem // bool has_inner_attrs; AST::AttrVec inner_attrs; // bool has_items; - std::vector<std::unique_ptr<Item> > items; + std::vector<std::unique_ptr<Item>> items; public: std::string as_string () const override; @@ -658,7 +657,7 @@ public: // Full constructor Module (Analysis::NodeMapping mappings, Identifier module_name, - Location locus, std::vector<std::unique_ptr<Item> > items, + Location locus, std::vector<std::unique_ptr<Item>> items, Visibility visibility = Visibility::create_error (), AST::AttrVec inner_attrs = AST::AttrVec (), AST::AttrVec outer_attrs = AST::AttrVec ()) @@ -696,7 +695,7 @@ public: void accept_vis (HIRVisitor &vis) override; - std::vector<std::unique_ptr<Item> > &get_items () { return items; }; + std::vector<std::unique_ptr<Item>> &get_items () { return items; }; /* Override that runs the function recursively on all items contained within * the module. */ @@ -867,11 +866,11 @@ private: PathType path_type; AST::SimplePath path; - std::vector<std::unique_ptr<UseTree> > trees; + std::vector<std::unique_ptr<UseTree>> trees; public: UseTreeList (PathType path_type, AST::SimplePath path, - std::vector<std::unique_ptr<UseTree> > trees, Location locus) + std::vector<std::unique_ptr<UseTree>> trees, Location locus) : UseTree (locus), path_type (path_type), path (std::move (path)), trees (std::move (trees)) { @@ -1043,7 +1042,7 @@ class Function : public VisItem, public ImplItem { FunctionQualifiers qualifiers; Identifier function_name; - std::vector<std::unique_ptr<GenericParam> > generic_params; + std::vector<std::unique_ptr<GenericParam>> generic_params; std::vector<FunctionParam> function_params; std::unique_ptr<Type> return_type; WhereClause where_clause; @@ -1069,7 +1068,7 @@ public: // Mega-constructor with all possible fields Function (Analysis::NodeMapping mappings, Identifier function_name, FunctionQualifiers qualifiers, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, std::vector<FunctionParam> function_params, std::unique_ptr<Type> return_type, WhereClause where_clause, std::unique_ptr<BlockExpr> function_body, Visibility vis, @@ -1139,11 +1138,11 @@ public: return function_params; } - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } - const std::vector<std::unique_ptr<GenericParam> > &get_generic_params () const + const std::vector<std::unique_ptr<GenericParam>> &get_generic_params () const { return generic_params; } @@ -1203,7 +1202,7 @@ class TypeAlias : public VisItem, public ImplItem // bool has_generics; // Generics generic_params; - std::vector<std::unique_ptr<GenericParam> > generic_params; // inlined + std::vector<std::unique_ptr<GenericParam>> generic_params; // inlined // bool has_where_clause; WhereClause where_clause; @@ -1223,7 +1222,7 @@ public: // Mega-constructor with all possible fields TypeAlias (Analysis::NodeMapping mappings, Identifier new_type_name, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, WhereClause where_clause, std::unique_ptr<Type> existing_type, Visibility vis, AST::AttrVec outer_attrs, Location locus) : VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)), @@ -1268,11 +1267,11 @@ public: void accept_vis (HIRVisitor &vis) override; - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } - const std::vector<std::unique_ptr<GenericParam> > &get_generic_params () const + const std::vector<std::unique_ptr<GenericParam>> &get_generic_params () const { return generic_params; } @@ -1318,7 +1317,7 @@ protected: // bool has_generics; // Generics generic_params; - std::vector<std::unique_ptr<GenericParam> > generic_params; // inlined + std::vector<std::unique_ptr<GenericParam>> generic_params; // inlined // bool has_where_clause; WhereClause where_clause; @@ -1336,14 +1335,14 @@ public: Location get_locus () const override final { return locus; } - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } protected: Struct (Analysis::NodeMapping mappings, Identifier struct_name, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, WhereClause where_clause, Visibility vis, Location locus, AST::AttrVec outer_attrs = AST::AttrVec ()) : VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)), @@ -1465,7 +1464,7 @@ public: // Mega-constructor with all possible fields StructStruct (Analysis::NodeMapping mappings, std::vector<StructField> fields, Identifier struct_name, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, WhereClause where_clause, bool is_unit, Visibility vis, AST::AttrVec outer_attrs, Location locus) : Struct (std::move (mappings), std::move (struct_name), @@ -1476,7 +1475,7 @@ public: // Unit struct constructor StructStruct (Analysis::NodeMapping mappings, Identifier struct_name, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, WhereClause where_clause, Visibility vis, AST::AttrVec outer_attrs, Location locus) : Struct (std::move (mappings), std::move (struct_name), @@ -1597,7 +1596,7 @@ public: // Mega-constructor with all possible fields TupleStruct (Analysis::NodeMapping mappings, std::vector<TupleField> fields, Identifier struct_name, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, WhereClause where_clause, Visibility vis, AST::AttrVec outer_attrs, Location locus) : Struct (std::move (mappings), std::move (struct_name), @@ -1786,12 +1785,12 @@ class Enum : public VisItem // bool has_generics; // Generics generic_params; - std::vector<std::unique_ptr<GenericParam> > generic_params; // inlined + std::vector<std::unique_ptr<GenericParam>> generic_params; // inlined // bool has_where_clause; WhereClause where_clause; - std::vector<std::unique_ptr<EnumItem> > items; + std::vector<std::unique_ptr<EnumItem>> items; Location locus; @@ -1810,8 +1809,8 @@ public: // Mega-constructor Enum (Analysis::NodeMapping mappings, Identifier enum_name, Visibility vis, - std::vector<std::unique_ptr<GenericParam> > generic_params, - WhereClause where_clause, std::vector<std::unique_ptr<EnumItem> > items, + std::vector<std::unique_ptr<GenericParam>> generic_params, + WhereClause where_clause, std::vector<std::unique_ptr<EnumItem>> items, AST::AttrVec outer_attrs, Location locus) : VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)), enum_name (std::move (enum_name)), @@ -1884,7 +1883,7 @@ class Union : public VisItem // bool has_generics; // Generics generic_params; - std::vector<std::unique_ptr<GenericParam> > generic_params; // inlined + std::vector<std::unique_ptr<GenericParam>> generic_params; // inlined // bool has_where_clause; WhereClause where_clause; @@ -1903,7 +1902,7 @@ public: bool has_where_clause () const { return !where_clause.is_empty (); } Union (Analysis::NodeMapping mappings, Identifier union_name, Visibility vis, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, WhereClause where_clause, std::vector<StructField> variants, AST::AttrVec outer_attrs, Location locus) : VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)), @@ -1944,7 +1943,7 @@ public: Union (Union &&other) = default; Union &operator= (Union &&other) = default; - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } @@ -2116,7 +2115,7 @@ struct TraitFunctionDecl private: FunctionQualifiers qualifiers; Identifier function_name; - std::vector<std::unique_ptr<GenericParam> > generic_params; + std::vector<std::unique_ptr<GenericParam>> generic_params; std::vector<FunctionParam> function_params; std::unique_ptr<Type> return_type; WhereClause where_clause; @@ -2125,7 +2124,7 @@ private: public: // Mega-constructor TraitFunctionDecl (Identifier function_name, FunctionQualifiers qualifiers, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, SelfParam self, std::vector<FunctionParam> function_params, std::unique_ptr<Type> return_type, WhereClause where_clause) @@ -2196,7 +2195,7 @@ public: Identifier get_function_name () const { return function_name; } - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } @@ -2366,7 +2365,7 @@ class TraitItemType : public TraitItem AST::AttrVec outer_attrs; Identifier name; - std::vector<std::unique_ptr<TypeParamBound> > + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds; // inlined form Location locus; @@ -2374,10 +2373,9 @@ public: // Returns whether trait item type has type param bounds. bool has_type_param_bounds () const { return !type_param_bounds.empty (); } - TraitItemType ( - Analysis::NodeMapping mappings, Identifier name, - std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds, - AST::AttrVec outer_attrs, Location locus) + TraitItemType (Analysis::NodeMapping mappings, Identifier name, + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds, + AST::AttrVec outer_attrs, Location locus) : TraitItem (mappings), outer_attrs (std::move (outer_attrs)), name (std::move (name)), type_param_bounds (std::move (type_param_bounds)), locus (locus) @@ -2421,7 +2419,7 @@ public: Identifier get_name () const { return name; } - std::vector<std::unique_ptr<TypeParamBound> > &get_type_param_bounds () + std::vector<std::unique_ptr<TypeParamBound>> &get_type_param_bounds () { return type_param_bounds; } @@ -2441,10 +2439,10 @@ class Trait : public VisItem { bool has_unsafe; Identifier name; - std::vector<std::unique_ptr<GenericParam> > generic_params; - std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds; + std::vector<std::unique_ptr<GenericParam>> generic_params; + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds; WhereClause where_clause; - std::vector<std::unique_ptr<TraitItem> > trait_items; + std::vector<std::unique_ptr<TraitItem>> trait_items; Location locus; public: @@ -2462,7 +2460,7 @@ public: // Returns whether trait has trait items. bool has_trait_items () const { return !trait_items.empty (); } - std::vector<std::unique_ptr<TraitItem> > &get_trait_items () + std::vector<std::unique_ptr<TraitItem>> &get_trait_items () { return trait_items; } @@ -2471,10 +2469,10 @@ public: // Mega-constructor Trait (Analysis::NodeMapping mappings, Identifier name, bool is_unsafe, - std::vector<std::unique_ptr<GenericParam> > generic_params, - std::vector<std::unique_ptr<TypeParamBound> > type_param_bounds, + std::vector<std::unique_ptr<GenericParam>> generic_params, + std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds, WhereClause where_clause, - std::vector<std::unique_ptr<TraitItem> > trait_items, Visibility vis, + std::vector<std::unique_ptr<TraitItem>> trait_items, Visibility vis, AST::AttrVec outer_attrs, Location locus) : VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)), has_unsafe (is_unsafe), name (std::move (name)), @@ -2534,16 +2532,27 @@ public: void accept_vis (HIRVisitor &vis) override; - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } - const std::vector<std::unique_ptr<GenericParam> > &get_generic_params () const + const std::vector<std::unique_ptr<GenericParam>> &get_generic_params () const { return generic_params; } + 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; + } + protected: /* Use covariance to implement clone function as returning this object * rather than base */ @@ -2552,18 +2561,18 @@ protected: class ImplBlock : public VisItem { - std::vector<std::unique_ptr<GenericParam> > generic_params; + std::vector<std::unique_ptr<GenericParam>> generic_params; std::unique_ptr<Type> impl_type; std::unique_ptr<TypePath> trait_ref; WhereClause where_clause; AST::AttrVec inner_attrs; Location locus; - std::vector<std::unique_ptr<ImplItem> > impl_items; + std::vector<std::unique_ptr<ImplItem>> impl_items; public: ImplBlock (Analysis::NodeMapping mappings, - std::vector<std::unique_ptr<ImplItem> > impl_items, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<ImplItem>> impl_items, + std::vector<std::unique_ptr<GenericParam>> generic_params, std::unique_ptr<Type> impl_type, std::unique_ptr<TypePath> trait_ref, WhereClause where_clause, Visibility vis, AST::AttrVec inner_attrs, AST::AttrVec outer_attrs, @@ -2619,12 +2628,12 @@ public: void accept_vis (HIRVisitor &vis) override; - std::vector<std::unique_ptr<ImplItem> > &get_impl_items () + std::vector<std::unique_ptr<ImplItem>> &get_impl_items () { return impl_items; }; - const std::vector<std::unique_ptr<ImplItem> > &get_impl_items () const + const std::vector<std::unique_ptr<ImplItem>> &get_impl_items () const { return impl_items; }; @@ -2642,7 +2651,7 @@ public: std::unique_ptr<Type> &get_type () { return impl_type; }; - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } @@ -2832,7 +2841,7 @@ class ExternalFunctionItem : public ExternalItem { // bool has_generics; // Generics generic_params; - std::vector<std::unique_ptr<GenericParam> > generic_params; // inlined + std::vector<std::unique_ptr<GenericParam>> generic_params; // inlined // bool has_return_type; // FunctionReturnType return_type; @@ -2856,7 +2865,7 @@ public: ExternalFunctionItem ( Analysis::NodeMapping mappings, Identifier item_name, - std::vector<std::unique_ptr<GenericParam> > generic_params, + std::vector<std::unique_ptr<GenericParam>> generic_params, std::unique_ptr<Type> return_type, WhereClause where_clause, std::vector<NamedFunctionParam> function_params, bool has_variadics, Visibility vis, AST::AttrVec outer_attrs, Location locus) @@ -2905,7 +2914,7 @@ public: void accept_vis (HIRVisitor &vis) override; - std::vector<std::unique_ptr<GenericParam> > &get_generic_params () + std::vector<std::unique_ptr<GenericParam>> &get_generic_params () { return generic_params; } @@ -2938,7 +2947,7 @@ class ExternBlock : public VisItem AST::AttrVec inner_attrs; // bool has_extern_items; - std::vector<std::unique_ptr<ExternalItem> > extern_items; + std::vector<std::unique_ptr<ExternalItem>> extern_items; Location locus; @@ -2957,7 +2966,7 @@ public: std::string get_abi () const { return abi; } ExternBlock (Analysis::NodeMapping mappings, std::string abi, - std::vector<std::unique_ptr<ExternalItem> > extern_items, + std::vector<std::unique_ptr<ExternalItem>> extern_items, Visibility vis, AST::AttrVec inner_attrs, AST::AttrVec outer_attrs, Location locus) : VisItem (std::move (mappings), std::move (vis), std::move (outer_attrs)), @@ -2998,7 +3007,7 @@ public: void accept_vis (HIRVisitor &vis) override; - std::vector<std::unique_ptr<ExternalItem> > &get_extern_items () + std::vector<std::unique_ptr<ExternalItem>> &get_extern_items () { return extern_items; } diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.h b/gcc/rust/typecheck/rust-hir-trait-resolve.h index 49aa2fa..b0e2c0d 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.h +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.h @@ -113,10 +113,6 @@ private: return tref; } - // Check if there is a super-trait, and apply this bound to the Self - // TypeParam - // FIXME - TyTy::BaseType *self = nullptr; std::vector<TyTy::SubstitutionParamMapping> substitutions; for (auto &generic_param : trait_reference->get_generic_params ()) @@ -147,6 +143,38 @@ private: rust_assert (self != nullptr); + // Check if there is a super-trait, and apply this bound to the Self + // TypeParam + std::vector<TyTy::TypeBoundPredicate> specified_bounds; + + // They also inherit themselves as a bound this enables a trait item to + // reference other Self::trait_items + specified_bounds.push_back ( + TyTy::TypeBoundPredicate (trait_reference->get_mappings ().get_defid (), + trait_reference->get_locus ())); + + if (trait_reference->has_type_param_bounds ()) + { + for (auto &bound : trait_reference->get_type_param_bounds ()) + { + if (bound->get_bound_type () + == HIR::TypeParamBound::BoundType::TRAITBOUND) + { + HIR::TraitBound *b + = static_cast<HIR::TraitBound *> (bound.get ()); + + // FIXME this might be recursive we need a check for that + + TraitReference *trait = resolve_trait_path (b->get_path ()); + TyTy::TypeBoundPredicate predicate ( + trait->get_mappings ().get_defid (), bound->get_locus ()); + + specified_bounds.push_back (std::move (predicate)); + } + } + } + self->inherit_bounds (specified_bounds); + std::vector<TraitItemReference> item_refs; for (auto &item : trait_reference->get_trait_items ()) { diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc index 316caea..398b531 100644 --- a/gcc/rust/typecheck/rust-tyty.cc +++ b/gcc/rust/typecheck/rust-tyty.cc @@ -99,7 +99,14 @@ BaseType::bounds_compatible (const BaseType &other, Location locus) const void BaseType::inherit_bounds (const BaseType &other) { - for (auto &bound : other.get_specified_bounds ()) + inherit_bounds (other.get_specified_bounds ()); +} + +void +BaseType::inherit_bounds ( + const std::vector<TyTy::TypeBoundPredicate> &specified_bounds) +{ + for (auto &bound : specified_bounds) { add_bound (bound); } @@ -310,7 +317,8 @@ StructFieldType::clone () const void SubstitutionParamMapping::override_context () { - rust_assert (param->can_resolve ()); + if (!param->can_resolve ()) + return; auto mappings = Analysis::Mappings::get (); auto context = Resolver::TypeCheckContext::get (); diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h index 33dc88b..d3d4afd 100644 --- a/gcc/rust/typecheck/rust-tyty.h +++ b/gcc/rust/typecheck/rust-tyty.h @@ -258,6 +258,9 @@ public: void inherit_bounds (const BaseType &other); + void inherit_bounds ( + const std::vector<TyTy::TypeBoundPredicate> &specified_bounds); + virtual bool is_unit () const { return false; } virtual bool is_concrete () const { return true; } diff --git a/gcc/testsuite/rust/compile/torture/traits16.rs b/gcc/testsuite/rust/compile/torture/traits16.rs new file mode 100644 index 0000000..afc4a86 --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/traits16.rs @@ -0,0 +1,20 @@ +trait A { + fn a() -> i32 { + 123 + } + + fn b() -> i32 { + Self::a() + 456 + } +} + +struct S; +impl A for S {} + +fn main() { + let a; + a = S::a(); + + let b; + b = S::b(); +} diff --git a/gcc/testsuite/rust/compile/torture/traits17.rs b/gcc/testsuite/rust/compile/torture/traits17.rs new file mode 100644 index 0000000..6da8bcb --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/traits17.rs @@ -0,0 +1,23 @@ +trait A { + fn a() -> i32 { + 123 + } +} + +trait B: A { + fn b() -> i32 { + Self::a() + 456 + } +} + +struct S; +impl A for S {} +impl B for S {} + +fn main() { + let a; + a = S::a(); + + let b; + b = S::b(); +} diff --git a/gcc/testsuite/rust/execute/torture/trait3.rs b/gcc/testsuite/rust/execute/torture/trait3.rs new file mode 100644 index 0000000..accfa9d --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/trait3.rs @@ -0,0 +1,43 @@ +/* { dg-output "123, 777" } */ +extern "C" { + fn printf(s: *const i8, ...); +} + +trait A { + fn a() -> i32 { + 123 + } +} + +trait B: A { + fn b() -> i32 { + <T as A>::a() + 456 + } +} + +struct T; +// { dg-warning "struct is never constructed" "" { target *-*-* } .-1 } + +impl A for T { + fn a() -> i32 { + 321 + } +} + +struct S; +impl A for S {} +impl B for S {} + +fn main() -> i32 { + let aa = S::a(); + let bb = S::b(); + + unsafe { + let a = "%i, %i\n\0"; + let b = a as *const str; + let c = b as *const i8; + + printf(c, aa, bb); + } + 0 +} |