File tree Expand file tree Collapse file tree 2 files changed +19
-3
lines changed
branches/beta/src/librustc_trans/trans Expand file tree Collapse file tree 2 files changed +19
-3
lines changed Original file line number Diff line number Diff line change @@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
23
23
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
24
24
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
25
25
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26
- refs/heads/beta: 02a141a5506ae499367c67e147688d049dd96efb
26
+ refs/heads/beta: 9a8b80762b4369772ae3f99a96efed1f3bdf8c1b
27
27
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
28
28
refs/heads/tmp: e06d2ad9fcd5027bcaac5b08fc9aa39a49d0ecd3
29
29
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
Original file line number Diff line number Diff line change @@ -378,11 +378,27 @@ impl FnType {
378
378
if abi == Abi :: Rust || abi == Abi :: RustCall ||
379
379
abi == Abi :: RustIntrinsic || abi == Abi :: PlatformIntrinsic {
380
380
let fixup = |arg : & mut ArgType | {
381
- if !arg. ty . is_aggregate ( ) {
381
+ let mut llty = arg. ty ;
382
+
383
+ // Replace newtypes with their inner-most type.
384
+ while llty. kind ( ) == llvm:: TypeKind :: Struct {
385
+ let inner = llty. field_types ( ) ;
386
+ if inner. len ( ) != 1 {
387
+ break ;
388
+ }
389
+ llty = inner[ 0 ] ;
390
+ }
391
+
392
+ if !llty. is_aggregate ( ) {
382
393
// Scalars and vectors, always immediate.
394
+ if llty != arg. ty {
395
+ // Needs a cast as we've unpacked a newtype.
396
+ arg. cast = Some ( llty) ;
397
+ }
383
398
return ;
384
399
}
385
- let size = llsize_of_real ( ccx, arg. ty ) ;
400
+
401
+ let size = llsize_of_real ( ccx, llty) ;
386
402
if size > llsize_of_real ( ccx, ccx. int_type ( ) ) {
387
403
arg. make_indirect ( ccx) ;
388
404
} else if size > 0 {
You can’t perform that action at this time.
0 commit comments