]> git.lizzy.rs Git - rust.git/commit
make C-like enums immediate
authorDaniel Micay <danielmicay@gmail.com>
Thu, 3 Oct 2013 10:19:02 +0000 (06:19 -0400)
committerDaniel Micay <danielmicay@gmail.com>
Thu, 3 Oct 2013 10:27:00 +0000 (06:27 -0400)
commitf504461a40d0f6fd88983be6d744c8d62b430506
tree278ac3650fb82652071b5be5c33f6abad91b9cd9
parent249b356fb3dba0998dbaef34980c9dd1c1e42f48
make C-like enums immediate

This fixes two existing bugs along the way:

* The `transmute` intrinsic did not correctly handle casts of immediate
  aggregates like newtype structs and tuples.
* The code for calling foreign functions used the wrong type to create
  an `alloca` temporary

    enum Foo { A, B }
    fn foo() -> Foo { A }

Before:

    ; Function Attrs: nounwind uwtable
    define void @_ZN3foo18hbedc642d5d9cf5aag4v0.0E(%enum.Foo* noalias nocapture sret, { i64, %tydesc*, i8*, i8*, i8 }* nocapture readnone) #0 {
    "function top level":
      %2 = getelementptr inbounds %enum.Foo* %0, i64 0, i32 0
      store i64 0, i64* %2, align 8
      ret void
    }

After:

    ; Function Attrs: nounwind readnone uwtable
    define %enum.Foo @_ZN3foo18hbedc642d5d9cf5aag4v0.0E({ i64, %tydesc*, i8*, i8*, i8 }* nocapture readnone) #0 {
    "function top level":
      ret %enum.Foo zeroinitializer
    }
src/librustc/middle/trans/common.rs
src/librustc/middle/trans/expr.rs
src/librustc/middle/trans/foreign.rs
src/librustc/middle/trans/intrinsic.rs