File tree 4 files changed +34
-10
lines changed
4 files changed +34
-10
lines changed Original file line number Diff line number Diff line change @@ -2989,14 +2989,35 @@ pub(crate) macro const_eval_select {
2989
2989
$( #[ $compiletime_attr: meta] ) * $compiletime: block
2990
2990
else
2991
2991
$( #[ $runtime_attr: meta] ) * $runtime: block
2992
+ ) => {
2993
+ // Use the `noinline` arm, after adding explicit `inline` attributes
2994
+ $crate:: intrinsics:: const_eval_select!(
2995
+ @capture { $( $arg : $ty = $val) , * } $( -> $ret) ? :
2996
+ #[ noinline]
2997
+ if const
2998
+ #[ inline] // prevent codegen on this function
2999
+ $( #[ $compiletime_attr] ) *
3000
+ $compiletime
3001
+ else
3002
+ #[ inline] // avoid the overhead of an extra fn call
3003
+ $( #[ $runtime_attr] ) *
3004
+ $runtime
3005
+ )
3006
+ } ,
3007
+ // With a leading #[noinline], we don't add inline attributes
3008
+ (
3009
+ @capture { $( $arg: ident : $ty: ty = $val: expr) , * $( , ) ? } $( -> $ret: ty ) ? :
3010
+ #[ noinline]
3011
+ if const
3012
+ $( #[ $compiletime_attr: meta] ) * $compiletime: block
3013
+ else
3014
+ $( #[ $runtime_attr: meta] ) * $runtime: block
2992
3015
) => { {
2993
- #[ inline] // avoid the overhead of an extra fn call
2994
3016
$( #[ $runtime_attr] ) *
2995
3017
fn runtime( $( $arg: $ty) , * ) $( -> $ret ) ? {
2996
3018
$runtime
2997
3019
}
2998
3020
2999
- #[ inline] // prevent codegen on this function
3000
3021
$( #[ $compiletime_attr] ) *
3001
3022
const fn compiletime( $( $arg: $ty) , * ) $( -> $ret ) ? {
3002
3023
// Don't warn if one of the arguments is unused.
Original file line number Diff line number Diff line change @@ -1268,8 +1268,9 @@ impl f128 {
1268
1268
min <= max,
1269
1269
"min > max, or either was NaN" ,
1270
1270
"min > max, or either was NaN. min = {min:?}, max = {max:?}" ,
1271
- min: f128,
1272
- max: f128,
1271
+ // FIXME(f16_f128): Passed by-ref to avoid codegen crashes
1272
+ min: & f128 = & min,
1273
+ max: & f128 = & max,
1273
1274
) ;
1274
1275
1275
1276
if self < min {
Original file line number Diff line number Diff line change @@ -1243,8 +1243,9 @@ impl f16 {
1243
1243
min <= max,
1244
1244
"min > max, or either was NaN" ,
1245
1245
"min > max, or either was NaN. min = {min:?}, max = {max:?}" ,
1246
- min: f16,
1247
- max: f16,
1246
+ // FIXME(f16_f128): Passed by-ref to avoid codegen crashes
1247
+ min: & f16 = & min,
1248
+ max: & f16 = & max,
1248
1249
) ;
1249
1250
1250
1251
if self < min {
Original file line number Diff line number Diff line change @@ -206,15 +206,16 @@ pub macro const_panic {
206
206
// add the `rustc_allow_const_fn_unstable`. This is okay to do
207
207
// because both variants will panic, just with different messages.
208
208
#[ rustc_allow_const_fn_unstable( const_eval_select) ]
209
- #[ inline( always) ]
209
+ #[ inline( always) ] // inline the wrapper
210
210
#[ track_caller]
211
211
#[ cfg_attr( bootstrap, rustc_const_stable( feature = "const_panic" , since = "CURRENT_RUSTC_VERSION" ) ) ]
212
212
const fn do_panic ( $( $arg: $ty) , * ) -> ! {
213
213
$crate:: intrinsics:: const_eval_select!(
214
- @capture { $( $arg: $ty) , * } -> !:
215
- if const #[ track_caller] {
214
+ @capture { $( $arg: $ty = $arg) , * } -> !:
215
+ #[ noinline]
216
+ if const #[ track_caller] #[ inline] { // Inline this, to prevent codegen
216
217
$crate :: panic!( $const_msg)
217
- } else #[ track_caller] {
218
+ } else #[ track_caller] { // Do not inline this, it makes perf worse
218
219
$crate :: panic!( $runtime_msg)
219
220
}
220
221
)
You can’t perform that action at this time.
0 commit comments