diff options
| author | bors <bors@rust-lang.org> | 2021-07-27 16:24:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-07-27 16:24:45 +0000 |
| commit | fd853c00e255559255885aadff9e93a1760c8728 (patch) | |
| tree | 49fd574977dbf99203919c48b27fb35438117d0b /compiler/rustc_ast_lowering/src | |
| parent | 3bc9dd0dd293ab82945e35888ed6d7ab802761ef (diff) | |
| parent | 8759f00c73641d44b3ab7a2290e3c58168d3e30f (diff) | |
| download | rust-fd853c00e255559255885aadff9e93a1760c8728.tar.gz rust-fd853c00e255559255885aadff9e93a1760c8728.zip | |
Auto merge of #83484 - JulianKnodt:infer, r=oli-obk,lcnr
Add hir::GenericArg::Infer In order to extend inference to consts, make an Infer type on hir::GenericArg.
Diffstat (limited to 'compiler/rustc_ast_lowering/src')
| -rw-r--r-- | compiler/rustc_ast_lowering/src/lib.rs | 93 |
1 files changed, 52 insertions, 41 deletions
diff --git a/compiler/rustc_ast_lowering/src/lib.rs b/compiler/rustc_ast_lowering/src/lib.rs index 57bf7be4056..3bd42ba6090 100644 --- a/compiler/rustc_ast_lowering/src/lib.rs +++ b/compiler/rustc_ast_lowering/src/lib.rs @@ -51,7 +51,7 @@ use rustc_hir::def::{DefKind, Namespace, PartialRes, PerNS, Res}; use rustc_hir::def_id::{DefId, DefIdMap, DefPathHash, LocalDefId, CRATE_DEF_ID}; use rustc_hir::definitions::{DefKey, DefPathData, Definitions}; use rustc_hir::intravisit; -use rustc_hir::{ConstArg, GenericArg, ParamName}; +use rustc_hir::{ConstArg, GenericArg, InferKind, ParamName}; use rustc_index::vec::{Idx, IndexVec}; use rustc_session::lint::builtin::{BARE_TRAIT_OBJECTS, MISSING_ABI}; use rustc_session::lint::{BuiltinLintDiagnostics, LintBuffer}; @@ -1243,48 +1243,59 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { match arg { ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(<)), ast::GenericArg::Type(ty) => { - // We parse const arguments as path types as we cannot distinguish them during - // parsing. We try to resolve that ambiguity by attempting resolution in both the - // type and value namespaces. If we resolved the path in the value namespace, we - // transform it into a generic const argument. - if let TyKind::Path(ref qself, ref path) = ty.kind { - if let Some(partial_res) = self.resolver.get_partial_res(ty.id) { - let res = partial_res.base_res(); - if !res.matches_ns(Namespace::TypeNS) { - debug!( - "lower_generic_arg: Lowering type argument as const argument: {:?}", - ty, - ); - - // Construct a AnonConst where the expr is the "ty"'s path. - - let parent_def_id = self.current_hir_id_owner.0; - let node_id = self.resolver.next_node_id(); - - // Add a definition for the in-band const def. - self.resolver.create_def( - parent_def_id, - node_id, - DefPathData::AnonConst, - ExpnId::root(), - ty.span, - ); - - let path_expr = Expr { - id: ty.id, - kind: ExprKind::Path(qself.clone(), path.clone()), - span: ty.span, - attrs: AttrVec::new(), - tokens: None, - }; - - let ct = self.with_new_scopes(|this| hir::AnonConst { - hir_id: this.lower_node_id(node_id), - body: this.lower_const_body(path_expr.span, Some(&path_expr)), - }); - return GenericArg::Const(ConstArg { value: ct, span: ty.span }); + match ty.kind { + TyKind::Infer if self.sess.features_untracked().generic_arg_infer => { + let hir_id = self.lower_node_id(ty.id); + return GenericArg::Infer(hir::InferArg { + hir_id, + span: ty.span, + kind: InferKind::Type, + }); + } + // We parse const arguments as path types as we cannot distinguish them during + // parsing. We try to resolve that ambiguity by attempting resolution in both the + // type and value namespaces. If we resolved the path in the value namespace, we + // transform it into a generic const argument. + TyKind::Path(ref qself, ref path) => { + if let Some(partial_res) = self.resolver.get_partial_res(ty.id) { + let res = partial_res.base_res(); + if !res.matches_ns(Namespace::TypeNS) { + debug!( + "lower_generic_arg: Lowering type argument as const argument: {:?}", + ty, + ); + + // Construct a AnonConst where the expr is the "ty"'s path. + + let parent_def_id = self.current_hir_id_owner.0; + let node_id = self.resolver.next_node_id(); + + // Add a definition for the in-band const def. + self.resolver.create_def( + parent_def_id, + node_id, + DefPathData::AnonConst, + ExpnId::root(), + ty.span, + ); + + let path_expr = Expr { + id: ty.id, + kind: ExprKind::Path(qself.clone(), path.clone()), + span: ty.span, + attrs: AttrVec::new(), + tokens: None, + }; + + let ct = self.with_new_scopes(|this| hir::AnonConst { + hir_id: this.lower_node_id(node_id), + body: this.lower_const_body(path_expr.span, Some(&path_expr)), + }); + return GenericArg::Const(ConstArg { value: ct, span: ty.span }); + } } } + _ => {} } GenericArg::Type(self.lower_ty_direct(&ty, itctx)) } |
