diff --git a/releasenotes.md b/releasenotes.md index 0dd9bf52a..218d79710 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -63,6 +63,7 @@ - Fix Vec2.angle - Update to libc::setjmp on Win32, to do no stack unwinding. - Recursively follow interfaces when looking up method. +- Int128 alignment fixed on x64 Linux. ### Stdlib changes diff --git a/src/compiler/target.c b/src/compiler/target.c index 687f7d001..7a9248207 100644 --- a/src/compiler/target.c +++ b/src/compiler/target.c @@ -1546,20 +1546,21 @@ static AlignData os_target_alignment_of_int(OsType os, ArchType arch, uint32_t b case ARCH_TYPE_PPC64: case ARCH_TYPE_PPC: case ARCH_TYPE_PPC64LE: - case ARCH_TYPE_X86_64: case ARCH_TYPE_WASM64: case ARCH_TYPE_RISCV32: case ARCH_TYPE_WASM32: case ARCH_TYPE_XTENSA: return (AlignData) { MIN(64u, bits), MIN(64u, bits) }; + case ARCH_TYPE_X86_64: case ARCH_TYPE_RISCV64: return (AlignData) { bits, bits }; case ARCH_TYPE_AARCH64: case ARCH_TYPE_AARCH64_BE: - if (bits < 32 && !os_is_apple(os) && os != OS_TYPE_WIN32) return (AlignData){ bits, 32 }; + if (bits < 32) return (AlignData){ bits, 32 }; return (AlignData) { bits, bits }; case ARCH_TYPE_X86: - if (bits < 32) return (AlignData) { bits, bits }; + if (bits <= 32) return (AlignData) { bits, bits }; + if (bits == 128) return (AlignData) { 128, 128 }; if (os == OS_TYPE_ELFIAMCU) return (AlignData) { 32, 32 }; if (os == OS_TYPE_WIN32 || os == OS_TYPE_NACL) return (AlignData) { 64, 64 }; return (AlignData) { 32, 64 }; diff --git a/test/test_suite/dynamic/dynamic_inherit_deep.c3t b/test/test_suite/dynamic/dynamic_inherit_deep.c3t new file mode 100644 index 000000000..7c2890401 --- /dev/null +++ b/test/test_suite/dynamic/dynamic_inherit_deep.c3t @@ -0,0 +1,18 @@ +module abc; +interface AstNode { + fn void free(); + fn double get_span(); + fn void dump(int depth); +} + +interface AstBodyStatement : AstNode { +} + +interface AstExpression : /* AstNode,*/ AstBodyStatement { +} + +fn void main() +{ + AstExpression a = null; + a.dump(100); +} \ No newline at end of file diff --git a/test/test_suite/literals/bin_literal2.c3t b/test/test_suite/literals/bin_literal2.c3t index 0f1738495..fb0f086c7 100644 --- a/test/test_suite/literals/bin_literal2.c3t +++ b/test/test_suite/literals/bin_literal2.c3t @@ -26,5 +26,5 @@ const int128 I128 = 0b0100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_000 @test.I = local_unnamed_addr constant i32 1073741824, align 4 @test.UL = local_unnamed_addr constant i64 -9223372036854775808, align 8 @test.L = local_unnamed_addr constant i64 4611686018427387904, align 8 -@test.UI128 = local_unnamed_addr constant i128 -170141183460469231731687303715884105728, align 8 -@test.I128 = local_unnamed_addr constant i128 85070591730234615865843651857942052864, align 8 +@test.UI128 = local_unnamed_addr constant i128 -170141183460469231731687303715884105728, align 16 +@test.I128 = local_unnamed_addr constant i128 85070591730234615865843651857942052864, align 16 \ No newline at end of file