| // RUN: cir-opt %s --verify-roundtrip | FileCheck %s |
| |
| !s32i = !cir.int<s, 32> |
| !s64i = !cir.int<s, 64> |
| !u32i = !cir.int<u, 32> |
| !u64i = !cir.int<u, 64> |
| |
| module { |
| // void empty() { } |
| cir.func @empty() { |
| cir.return |
| } |
| // CHECK: cir.func{{.*}} @empty() { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| // void empty() { } |
| cir.func no_proto @noProto() { |
| cir.return |
| } |
| // CHECK: cir.func no_proto @noProto() { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| // void voidret() { return; } |
| cir.func @voidret() { |
| cir.return |
| } |
| // CHECK: cir.func{{.*}} @voidret() { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| // int intfunc() { return 42; } |
| cir.func @intfunc() -> !s32i { |
| %0 = cir.const #cir.int<42> : !s32i |
| cir.return %0 : !s32i |
| } |
| // CHECK: cir.func{{.*}} @intfunc() -> !s32i { |
| // CHECK: %[[VAL:.*]] = cir.const #cir.int<42> : !s32i |
| // CHECK: cir.return %[[VAL]] : !s32i |
| // CHECK: } |
| |
| // Should print/parse function aliases. |
| cir.func @a_empty() alias(@empty) |
| // CHECK: cir.func @a_empty() alias(@empty) |
| |
| // Should print/parse function personality. |
| cir.func @personality_func() personality(@__gxx_personality_v0) { |
| cir.return |
| } |
| // CHECK: cir.func @personality_func() personality(@__gxx_personality_v0) { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| // int scopes() { |
| // { |
| // { |
| // return 99; |
| // } |
| // } |
| //} |
| cir.func @scopes() -> !s32i { |
| cir.scope { |
| cir.scope { |
| %0 = cir.const #cir.int<99> : !s32i |
| cir.return %0 : !s32i |
| } |
| } |
| cir.trap |
| } |
| // CHECK: cir.func{{.*}} @scopes() -> !s32i { |
| // CHECK: cir.scope { |
| // CHECK: cir.scope { |
| // CHECK: %[[VAL:.*]] = cir.const #cir.int<99> : !s32i |
| // CHECK: cir.return %[[VAL]] : !s32i |
| // CHECK: } |
| // CHECK: } |
| // CHECK: cir.trap |
| // CHECK: } |
| |
| // long longfunc() { return 42l; } |
| cir.func @longfunc() -> !s64i { |
| %0 = cir.const #cir.int<42> : !s64i |
| cir.return %0 : !s64i |
| } |
| // CHECK: cir.func{{.*}} @longfunc() -> !s64i |
| // CHECK: %0 = cir.const #cir.int<42> : !s64i |
| // CHECK: cir.return %0 : !s64i |
| // CHECK: } |
| |
| // unsigned unsignedfunc() { return 42u; } |
| cir.func @unsignedfunc() -> !u32i { |
| %0 = cir.const #cir.int<42> : !u32i |
| cir.return %0 : !u32i |
| } |
| // CHECK: cir.func{{.*}} @unsignedfunc() -> !u32i |
| // CHECK: %[[VAL:.*]] = cir.const #cir.int<42> : !u32i |
| // CHECK: cir.return %[[VAL]] : !u32i |
| // CHECK: } |
| |
| // unsigned long long ullfunc() { return 42ull; } |
| cir.func @ullfunc() -> !u64i { |
| %0 = cir.const #cir.int<42> : !u64i |
| cir.return %0 : !u64i |
| } |
| // CHECK: cir.func{{.*}} @ullfunc() -> !u64i |
| // CHECK: %[[VAL:.*]] = cir.const #cir.int<42> : !u64i |
| // CHECK: cir.return %[[VAL:.*]] : !u64i |
| // CHECK: } |
| |
| cir.func coroutine @coro() { |
| cir.coro.body { |
| cir.await(init, ready : { |
| %0 = cir.alloca "" align(1) : !cir.ptr<!cir.bool> |
| %1 = cir.load align(1) %0 : !cir.ptr<!cir.bool>, !cir.bool |
| cir.condition(%1) |
| }, suspend : { |
| cir.yield |
| }, resume : { |
| cir.yield |
| },) |
| cir.yield |
| } |
| cir.return |
| } |
| // CHECK: cir.func{{.*}} coroutine @coro() |
| |
| cir.func builtin @builtin() { |
| cir.return |
| } |
| // CHECK: cir.func{{.*}} builtin @builtin() |
| |
| cir.func @global_ctor_func() global_ctor { |
| cir.return |
| } |
| |
| // CHECK: cir.func @global_ctor_func() global_ctor { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| cir.func @global_ctor_with_priority() global_ctor(200) { |
| cir.return |
| } |
| |
| // CHECK: cir.func @global_ctor_with_priority() global_ctor(200) { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| cir.func @global_dtor_func() global_dtor { |
| cir.return |
| } |
| |
| // CHECK: cir.func @global_dtor_func() global_dtor { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| cir.func @global_dtor_with_priority() global_dtor(201) { |
| cir.return |
| } |
| |
| // CHECK: cir.func @global_dtor_with_priority() global_dtor(201) { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| } |
| |
| !rec_Foo = !cir.struct<"Foo" {!s32i}> |
| |
| cir.func @Foo_default() func_info<#cir.cxx_ctor<!rec_Foo, default>> { |
| cir.return |
| } |
| |
| // CHECK: cir.func @Foo_default() func_info<#cir.cxx_ctor<!rec_Foo, default>> { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| cir.func @Foo_trivial_copy() func_info<#cir.cxx_ctor<!rec_Foo, copy, trivial true>> { |
| cir.return |
| } |
| |
| // CHECK: cir.func @Foo_trivial_copy() func_info<#cir.cxx_ctor<!rec_Foo, copy, trivial true>> { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| cir.func @Foo_destructor() func_info<#cir.cxx_dtor<!rec_Foo>> { |
| cir.return |
| } |
| |
| // CHECK: cir.func @Foo_destructor() func_info<#cir.cxx_dtor<!rec_Foo>> { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| cir.func @Foo_move_assign() func_info<#cir.cxx_assign<!rec_Foo, move>> { |
| cir.return |
| } |
| |
| // CHECK: cir.func @Foo_move_assign() func_info<#cir.cxx_assign<!rec_Foo, move>> { |
| // CHECK: cir.return |
| // CHECK: } |
| |
| cir.func @has_attrs() attributes {foo, baz = 5, floof = "flop"} { |
| cir.return |
| } |
| |
| // CHECK: cir.func @has_attrs() attributes {baz = 5 : i64{{.*}}, floof = "flop", foo} { |
| // CHECK: cir.return |
| // CHECK: } |