diff options
Diffstat (limited to 'clang/test/CIR/CodeGen/struct-init.cpp')
-rw-r--r-- | clang/test/CIR/CodeGen/struct-init.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/clang/test/CIR/CodeGen/struct-init.cpp b/clang/test/CIR/CodeGen/struct-init.cpp index cb50999..7988619 100644 --- a/clang/test/CIR/CodeGen/struct-init.cpp +++ b/clang/test/CIR/CodeGen/struct-init.cpp @@ -5,6 +5,21 @@ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll // RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s +struct BitfieldStruct { + unsigned int a:4; + unsigned int b:14; + unsigned int c:14; +}; + +BitfieldStruct overlapping_init = { 3, 2, 1 }; + +// This is unintuitive. The bitfields are initialized using a struct of constants +// that maps to the bitfields but splits the value into bytes. + +// CIR: cir.global external @overlapping_init = #cir.const_record<{#cir.int<35> : !u8i, #cir.int<0> : !u8i, #cir.int<4> : !u8i, #cir.int<0> : !u8i}> : !rec_anon_struct +// LLVM: @overlapping_init = global { i8, i8, i8, i8 } { i8 35, i8 0, i8 4, i8 0 } +// OGCG: @overlapping_init = global { i8, i8, i8, i8 } { i8 35, i8 0, i8 4, i8 0 } + struct S { int a, b, c; }; @@ -25,6 +40,23 @@ StructWithDefaultInit swdi = {}; // LLVM: @swdi = global %struct.StructWithDefaultInit { i32 2 }, align 4 // OGCG: @swdi = global %struct.StructWithDefaultInit { i32 2 }, align 4 +struct StructWithFieldInitFromConst { + int a : 10; + int b = a; +}; + +StructWithFieldInitFromConst swfifc = {}; + +// CIR: cir.global external @swfifc = #cir.zero : !rec_anon_struct +// LLVM: @swfifc = global { i8, i8, i32 } zeroinitializer, align 4 +// OGCG: @swfifc = global { i8, i8, i32 } zeroinitializer, align 4 + +StructWithFieldInitFromConst swfifc2 = { 2 }; + +// CIR: cir.global external @swfifc2 = #cir.const_record<{#cir.int<2> : !u8i, #cir.int<0> : !u8i, #cir.int<2> : !s32i}> : !rec_anon_struct +// LLVM: @swfifc2 = global { i8, i8, i32 } { i8 2, i8 0, i32 2 }, align 4 +// OGCG: @swfifc2 = global { i8, i8, i32 } { i8 2, i8 0, i32 2 }, align 4 + void init() { S s1 = {1, 2, 3}; S s2 = {4, 5}; |