do not promote comparing function pointers

This commit is contained in:
Ralf Jung 2018-09-30 19:45:31 +02:00
parent 1886d5fe1c
commit 1397836380
3 changed files with 10 additions and 2 deletions

View file

@ -750,7 +750,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Qualifier<'a, 'tcx, 'tcx> {
}
Rvalue::BinaryOp(op, ref lhs, _) => {
if let ty::RawPtr(_) = lhs.ty(self.mir, self.tcx).sty {
if let ty::RawPtr(_) | ty::FnPtr(..) = lhs.ty(self.mir, self.tcx).sty {
assert!(op == BinOp::Eq || op == BinOp::Ne ||
op == BinOp::Le || op == BinOp::Lt ||
op == BinOp::Ge || op == BinOp::Gt ||

View file

@ -348,7 +348,7 @@ fn check_expr_kind<'a, 'tcx>(
return NotPromotable;
}
match v.tables.node_id_to_type(lhs.hir_id).sty {
ty::RawPtr(_) => {
ty::RawPtr(_) | ty::FnPtr(..) => {
assert!(op.node == hir::BinOpKind::Eq || op.node == hir::BinOpKind::Ne ||
op.node == hir::BinOpKind::Le || op.node == hir::BinOpKind::Lt ||
op.node == hir::BinOpKind::Ge || op.node == hir::BinOpKind::Gt);

View file

@ -0,0 +1,8 @@
// run-pass
fn main() {
// We shouldn't promote this
&(main as fn() == main as fn());
// Also check nested case
&(&(main as fn()) == &(main as fn()));
}