@@ -20,7 +20,6 @@ use rustc_middle::{bug, span_bug};
20
20
use rustc_span:: { Span , sym} ;
21
21
use tracing:: { debug, info, instrument, trace} ;
22
22
23
- use crate :: errors;
24
23
use crate :: thir:: cx:: Cx ;
25
24
use crate :: thir:: util:: UserAnnotatedTyHelpers ;
26
25
@@ -380,45 +379,25 @@ impl<'tcx> Cx<'tcx> {
380
379
from_hir_call : true ,
381
380
fn_span : expr. span ,
382
381
}
383
- } else {
384
- let attrs = tcx. hir ( ) . attrs ( expr. hir_id ) ;
385
- if attrs. iter ( ) . any ( |a| a. name_or_empty ( ) == sym:: rustc_box) {
386
- if attrs. len ( ) != 1 {
387
- tcx. dcx ( ) . emit_err ( errors:: RustcBoxAttributeError {
388
- span : attrs[ 0 ] . span ,
389
- reason : errors:: RustcBoxAttrReason :: Attributes ,
390
- } ) ;
391
- } else if let Some ( box_item) = tcx. lang_items ( ) . owned_box ( ) {
392
- if let hir:: ExprKind :: Path ( hir:: QPath :: TypeRelative ( ty, fn_path) ) =
393
- fun. kind
394
- && let hir:: TyKind :: Path ( hir:: QPath :: Resolved ( _, path) ) = ty. kind
395
- && path. res . opt_def_id ( ) . is_some_and ( |did| did == box_item)
396
- && fn_path. ident . name == sym:: new
397
- && let [ value] = args
398
- {
399
- return Expr {
400
- temp_lifetime : TempLifetime {
401
- temp_lifetime,
402
- backwards_incompatible,
403
- } ,
404
- ty : expr_ty,
405
- span : expr. span ,
406
- kind : ExprKind :: Box { value : self . mirror_expr ( value) } ,
407
- } ;
408
- } else {
409
- tcx. dcx ( ) . emit_err ( errors:: RustcBoxAttributeError {
410
- span : expr. span ,
411
- reason : errors:: RustcBoxAttrReason :: NotBoxNew ,
412
- } ) ;
413
- }
414
- } else {
415
- tcx. dcx ( ) . emit_err ( errors:: RustcBoxAttributeError {
416
- span : attrs[ 0 ] . span ,
417
- reason : errors:: RustcBoxAttrReason :: MissingBox ,
418
- } ) ;
419
- }
382
+ } else if let ty:: FnDef ( def_id, _) = self . typeck_results ( ) . expr_ty ( fun) . kind ( )
383
+ && let Some ( intrinsic) = self . tcx . intrinsic ( def_id)
384
+ && intrinsic. name == sym:: box_new
385
+ {
386
+ // We don't actually evaluate `fun` here, so make sure that doesn't miss any side-effects.
387
+ if !matches ! ( fun. kind, hir:: ExprKind :: Path ( _) ) {
388
+ span_bug ! (
389
+ expr. span,
390
+ "`box_new` intrinsic can only be called via path expression"
391
+ ) ;
420
392
}
421
-
393
+ let value = & args[ 0 ] ;
394
+ return Expr {
395
+ temp_lifetime : TempLifetime { temp_lifetime, backwards_incompatible } ,
396
+ ty : expr_ty,
397
+ span : expr. span ,
398
+ kind : ExprKind :: Box { value : self . mirror_expr ( value) } ,
399
+ } ;
400
+ } else {
422
401
// Tuple-like ADTs are represented as ExprKind::Call. We convert them here.
423
402
let adt_data = if let hir:: ExprKind :: Path ( ref qpath) = fun. kind
424
403
&& let Some ( adt_def) = expr_ty. ty_adt_def ( )
0 commit comments