diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2022-12-03 09:32:29 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2022-12-03 09:34:06 +0000 |
| commit | e973240d18f131d4fe48c4920f92a044c7503299 (patch) | |
| tree | 6ac957bd7f161d674efd21371f4b87415d3c44bd | |
| parent | 24f2704e96c9d3a4f887d2d0a7d79ecffd79bd65 (diff) | |
| download | rust-e973240d18f131d4fe48c4920f92a044c7503299.tar.gz rust-e973240d18f131d4fe48c4920f92a044c7503299.zip | |
Do not call fn_sig on non-functions.
| -rw-r--r-- | compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/suggestions/assoc-const-as-fn.rs | 18 | ||||
| -rw-r--r-- | src/test/ui/suggestions/assoc-const-as-fn.stderr | 14 |
3 files changed, 40 insertions, 0 deletions
diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs index 86384c7b93e..3078e0cbeda 100644 --- a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs +++ b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs @@ -1918,6 +1918,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { receiver: Option<&'tcx hir::Expr<'tcx>>, args: &'tcx [hir::Expr<'tcx>], ) -> bool { + // Do not call `fn_sig` on non-functions. + if !matches!( + self.tcx.def_kind(def_id), + DefKind::Fn | DefKind::AssocFn | DefKind::Variant | DefKind::Ctor(..) + ) { + return false; + } + let sig = self.tcx.fn_sig(def_id).skip_binder(); let args_referencing_param: Vec<_> = sig .inputs() diff --git a/src/test/ui/suggestions/assoc-const-as-fn.rs b/src/test/ui/suggestions/assoc-const-as-fn.rs new file mode 100644 index 00000000000..4b4595dd5e6 --- /dev/null +++ b/src/test/ui/suggestions/assoc-const-as-fn.rs @@ -0,0 +1,18 @@ +unsafe fn pointer(v: usize, w: u32) {} + +pub trait UniformScalar {} +impl UniformScalar for u32 {} + +pub trait GlUniformScalar: UniformScalar { + const FACTORY: unsafe fn(usize, Self) -> (); +} +impl GlUniformScalar for u32 { + const FACTORY: unsafe fn(usize, Self) -> () = pointer; +} + +pub fn foo<T: UniformScalar>(value: T) { + <T as GlUniformScalar>::FACTORY(1, value); + //~^ ERROR the trait bound `T: GlUniformScalar` is not satisfied +} + +fn main() {} diff --git a/src/test/ui/suggestions/assoc-const-as-fn.stderr b/src/test/ui/suggestions/assoc-const-as-fn.stderr new file mode 100644 index 00000000000..fa740687858 --- /dev/null +++ b/src/test/ui/suggestions/assoc-const-as-fn.stderr @@ -0,0 +1,14 @@ +error[E0277]: the trait bound `T: GlUniformScalar` is not satisfied + --> $DIR/assoc-const-as-fn.rs:14:5 + | +LL | <T as GlUniformScalar>::FACTORY(1, value); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `GlUniformScalar` is not implemented for `T` + | +help: consider further restricting this bound + | +LL | pub fn foo<T: UniformScalar + GlUniformScalar>(value: T) { + | +++++++++++++++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. |
