namespace Rust {
namespace TyTy {
-SubstitutionParamMapping::SubstitutionParamMapping (HIR::TypeParam &generic,
+SubstitutionParamMapping::SubstitutionParamMapping (HIR::GenericParam &generic,
ParamType *param)
: generic (generic), param (param)
{}
return param;
}
-HIR::TypeParam &
+HIR::GenericParam &
SubstitutionParamMapping::get_generic_param ()
{
return generic;
}
-const HIR::TypeParam &
+const HIR::GenericParam &
SubstitutionParamMapping::get_generic_param () const
{
return generic;
return !(get_param_ty ()->is_concrete ());
}
+Identifier
+SubstitutionParamMapping::get_type_representation () const
+{
+ rust_assert (generic.get_kind () == HIR::GenericParam::GenericKind::TYPE);
+ const auto &type_param = static_cast<const HIR::TypeParam &> (generic);
+ return type_param.get_type_representation ();
+}
+
location_t
SubstitutionParamMapping::get_param_locus () const
{
bool
SubstitutionParamMapping::param_has_default_ty () const
{
- return generic.has_type ();
+ if (generic.get_kind () != HIR::GenericParam::GenericKind::TYPE)
+ return false;
+
+ const auto &type_param = static_cast<const HIR::TypeParam &> (generic);
+ return type_param.has_type ();
}
BaseType *
SubstitutionParamMapping::get_default_ty () const
{
- TyVar var (generic.get_type_mappings ().get_hirid ());
+ rust_assert (generic.get_kind () == HIR::GenericParam::GenericKind::TYPE);
+
+ const auto &type_param = static_cast<const HIR::TypeParam &> (generic);
+ TyVar var (type_param.get_type_mappings ().get_hirid ());
return var.get_tyty ();
}
{
rich_location r (line_table, args.get_locus ());
if (!substitutions.empty ())
- r.add_range (substitutions.front ().get_param_locus ());
+ {
+ const auto &subst = substitutions.front ();
+ const auto &generic = subst.get_generic_param ();
+ r.add_range (generic.get_locus ());
+ }
rust_error_at (
r,
if (args.get_type_args ().size () + offs < min_required_substitutions ())
{
rich_location r (line_table, args.get_locus ());
- r.add_range (substitutions.front ().get_param_locus ());
+ if (!substitutions.empty ())
+ {
+ const auto &subst = substitutions.front ();
+ const auto &generic = subst.get_generic_param ();
+ r.add_range (generic.get_locus ());
+ }
rust_error_at (
r, ErrorCode::E0107,
}
const auto ¶m_mapping = substitutions.at (offs);
- const auto &type_param = param_mapping.get_generic_param ();
- if (type_param.from_impl_trait ())
+ const auto &generic = param_mapping.get_generic_param ();
+ if (generic.get_kind () == HIR::GenericParam::GenericKind::TYPE)
{
- rich_location r (line_table, arg->get_locus ());
- r.add_fixit_remove (arg->get_locus ());
- rust_error_at (r, ErrorCode::E0632,
- "cannot provide explicit generic arguments when "
- "%<impl Trait%> is used in argument position");
- return SubstitutionArgumentMappings::error ();
+ const auto &type_param
+ = static_cast<const HIR::TypeParam &> (generic);
+ if (type_param.from_impl_trait ())
+ {
+ rich_location r (line_table, arg->get_locus ());
+ r.add_fixit_remove (arg->get_locus ());
+ rust_error_at (r, ErrorCode::E0632,
+ "cannot provide explicit generic arguments when "
+ "%<impl Trait%> is used in argument position");
+ return SubstitutionArgumentMappings::error ();
+ }
}
SubstitutionArg subst_arg (¶m_mapping, resolved);
#include "rust-hir-full-decls.h"
#include "rust-tyty-bounds.h"
#include "rust-tyty-region.h"
+#include "rust-ast.h"
#include "optional.h"
namespace Rust {
class SubstitutionParamMapping
{
public:
- SubstitutionParamMapping (HIR::TypeParam &generic, ParamType *param);
+ SubstitutionParamMapping (HIR::GenericParam &generic, ParamType *param);
SubstitutionParamMapping (const SubstitutionParamMapping &other);
SubstitutionParamMapping clone () const;
ParamType *get_param_ty ();
-
const ParamType *get_param_ty () const;
- HIR::TypeParam &get_generic_param ();
- const HIR::TypeParam &get_generic_param () const;
+ HIR::GenericParam &get_generic_param ();
+ const HIR::GenericParam &get_generic_param () const;
+
+ Identifier get_type_representation () const;
// this is used for the backend to override the HirId ref of the param to
// what the concrete type is for the rest of the context
bool need_substitution () const;
private:
- HIR::TypeParam &generic;
+ HIR::GenericParam &generic;
ParamType *param;
};