blob: 6fa8901333bab73c6c3f422eedde378e55f9c828 [file] [log] [blame]
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++17 -fclangir -Wno-unused-value -emit-cir %s -o %t.cir
// RUN: FileCheck --input-file=%t.cir %s
struct Point {
int x;
int y;
int z;
};
// CHECK-DAG: !ty_Point = !cir.struct<struct "Point" {!cir.int<s, 32>, !cir.int<s, 32>, !cir.int<s, 32>}
struct Incomplete;
// CHECK-DAG: !ty_Incomplete = !cir.struct<struct "Incomplete" incomplete>
int Point::*pt_member = &Point::x;
// CHECK: cir.global external @pt_member = #cir.data_member<0> : !cir.data_member<!s32i in !ty_Point>
auto test1() -> int Point::* {
return &Point::y;
}
// CHECK: cir.func @_Z5test1v() -> !cir.data_member<!s32i in !ty_Point>
// CHECK: %{{.+}} = cir.const #cir.data_member<1> : !cir.data_member<!s32i in !ty_Point>
// CHECK: }
int test2(const Point &pt, int Point::*member) {
return pt.*member;
}
// CHECK: cir.func @_Z5test2RK5PointMS_i
// CHECK: %{{.+}} = cir.get_runtime_member %{{.+}}[%{{.+}} : !cir.data_member<!s32i in !ty_Point>] : !cir.ptr<!ty_Point> -> !cir.ptr<!s32i>
// CHECK: }
int test3(const Point *pt, int Point::*member) {
return pt->*member;
}
// CHECK: cir.func @_Z5test3PK5PointMS_i
// CHECK: %{{.+}} = cir.get_runtime_member %{{.+}}[%{{.+}} : !cir.data_member<!s32i in !ty_Point>] : !cir.ptr<!ty_Point> -> !cir.ptr<!s32i>
// CHECK: }
auto test4(int Incomplete::*member) -> int Incomplete::* {
return member;
}
// CHECK: cir.func @_Z5test4M10Incompletei(%arg0: !cir.data_member<!s32i in !ty_Incomplete> loc({{.+}})) -> !cir.data_member<!s32i in !ty_Incomplete>
int test5(Incomplete *ic, int Incomplete::*member) {
return ic->*member;
}
// CHECK: cir.func @_Z5test5P10IncompleteMS_i
// CHECK: %{{.+}} = cir.get_runtime_member %{{.+}}[%{{.+}} : !cir.data_member<!s32i in !ty_Incomplete>] : !cir.ptr<!ty_Incomplete> -> !cir.ptr<!s32i>
// CHECK: }
auto test_null() -> int Point::* {
return nullptr;
}
// CHECK: cir.func @_Z9test_nullv
// CHECK: %{{.+}} = cir.const #cir.data_member<null> : !cir.data_member<!s32i in !ty_Point>
// CHECK: }
auto test_null_incomplete() -> int Incomplete::* {
return nullptr;
}
// CHECK: cir.func @_Z20test_null_incompletev
// CHECK: %{{.+}} = cir.const #cir.data_member<null> : !cir.data_member<!s32i in !ty_Incomplete>
// CHECK: }