@@ -1042,30 +1042,31 @@ impl<'a, 'tcx> CastCheck<'tcx> {
1042
1042
m_cast : ty:: TypeAndMut < ' tcx > ,
1043
1043
) -> Result < CastKind , CastError < ' tcx > > {
1044
1044
// array-ptr-cast: allow mut-to-mut, mut-to-const, const-to-const
1045
- if m_expr. mutbl >= m_cast. mutbl {
1046
- if let ty:: Array ( ety, _) = m_expr. ty . kind ( ) {
1047
- // Due to the limitations of LLVM global constants,
1048
- // region pointers end up pointing at copies of
1049
- // vector elements instead of the original values.
1050
- // To allow raw pointers to work correctly, we
1051
- // need to special-case obtaining a raw pointer
1052
- // from a region pointer to a vector.
1053
-
1054
- // Coerce to a raw pointer so that we generate RawPtr in MIR.
1055
- let array_ptr_type = Ty :: new_ptr ( fcx. tcx , m_expr. ty , m_expr. mutbl ) ;
1056
- fcx. coerce ( self . expr , self . expr_ty , array_ptr_type, AllowTwoPhase :: No , None )
1057
- . unwrap_or_else ( |_| {
1058
- bug ! (
1045
+ if m_expr. mutbl >= m_cast. mutbl
1046
+ && let ty:: Array ( ety, _) = m_expr. ty . kind ( )
1047
+ && fcx. can_eq ( fcx. param_env , * ety, m_cast. ty )
1048
+ {
1049
+ // Due to the limitations of LLVM global constants,
1050
+ // region pointers end up pointing at copies of
1051
+ // vector elements instead of the original values.
1052
+ // To allow raw pointers to work correctly, we
1053
+ // need to special-case obtaining a raw pointer
1054
+ // from a region pointer to a vector.
1055
+
1056
+ // Coerce to a raw pointer so that we generate RawPtr in MIR.
1057
+ let array_ptr_type = Ty :: new_ptr ( fcx. tcx , m_expr. ty , m_expr. mutbl ) ;
1058
+ fcx. coerce ( self . expr , self . expr_ty , array_ptr_type, AllowTwoPhase :: No , None )
1059
+ . unwrap_or_else ( |_| {
1060
+ bug ! (
1059
1061
"could not cast from reference to array to pointer to array ({:?} to {:?})" ,
1060
1062
self . expr_ty,
1061
1063
array_ptr_type,
1062
1064
)
1063
- } ) ;
1065
+ } ) ;
1064
1066
1065
- // this will report a type mismatch if needed
1066
- fcx. demand_eqtype ( self . span , * ety, m_cast. ty ) ;
1067
- return Ok ( CastKind :: ArrayPtrCast ) ;
1068
- }
1067
+ // this will report a type mismatch if needed
1068
+ fcx. demand_eqtype ( self . span , * ety, m_cast. ty ) ;
1069
+ return Ok ( CastKind :: ArrayPtrCast ) ;
1069
1070
}
1070
1071
1071
1072
Err ( CastError :: IllegalCast )
0 commit comments