Skip to content

Commit 2506603

Browse files
committed
Addressing llvm#130.
1 parent 997a9b6 commit 2506603

File tree

4 files changed

+31
-35
lines changed

4 files changed

+31
-35
lines changed

clang/lib/AST/ExprConstantMeta.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -811,9 +811,9 @@ static constexpr Metafunction Metafunctions[] = {
811811
{ Metafunction::MFRK_metaInfo, 2, 2, reflect_result },
812812
{ Metafunction::MFRK_metaInfo, 10, 10, data_member_spec },
813813
{ Metafunction::MFRK_metaInfo, 3, 3, define_aggregate },
814-
{ Metafunction::MFRK_sizeT, 1, 1, offset_of },
814+
{ Metafunction::MFRK_spliceFromArg, 2, 2, offset_of },
815815
{ Metafunction::MFRK_sizeT, 1, 1, size_of },
816-
{ Metafunction::MFRK_sizeT, 1, 1, bit_offset_of },
816+
{ Metafunction::MFRK_spliceFromArg, 2, 2, bit_offset_of },
817817
{ Metafunction::MFRK_sizeT, 1, 1, bit_size_of },
818818
{ Metafunction::MFRK_sizeT, 1, 1, alignment_of },
819819

@@ -4891,10 +4891,9 @@ bool offset_of(APValue &Result, ASTContext &C, MetaActions &Meta,
48914891
QualType ResultTy, SourceRange Range, ArrayRef<Expr *> Args,
48924892
Decl *ContainingDecl) {
48934893
assert(Args[0]->getType()->isReflectionType());
4894-
assert(ResultTy == C.getSizeType());
48954894

48964895
APValue RV;
4897-
if (!Evaluator(RV, Args[0], true))
4896+
if (!Evaluator(RV, Args[1], true))
48984897
return true;
48994898

49004899
switch (RV.getReflectionKind()) {
@@ -4912,8 +4911,7 @@ bool offset_of(APValue &Result, ASTContext &C, MetaActions &Meta,
49124911
case ReflectionKind::Declaration: {
49134912
if (const FieldDecl *FD = dyn_cast<FieldDecl>(RV.getReflectedDecl())) {
49144913
size_t Offset = getBitOffsetOfField(C, FD) / C.getTypeSize(C.CharTy);
4915-
return SetAndSucceed(Result,
4916-
APValue(C.MakeIntValue(Offset, C.getSizeType())));
4914+
return SetAndSucceed(Result, APValue(C.MakeIntValue(Offset, ResultTy)));
49174915
}
49184916
return DiagnoseReflectionKind(Diagnoser, Range, "a non-static data member",
49194917
DescriptionOf(RV));
@@ -4980,10 +4978,9 @@ bool bit_offset_of(APValue &Result, ASTContext &C, MetaActions &Meta,
49804978
QualType ResultTy, SourceRange Range,
49814979
ArrayRef<Expr *> Args, Decl *ContainingDecl) {
49824980
assert(Args[0]->getType()->isReflectionType());
4983-
assert(ResultTy == C.getSizeType());
49844981

49854982
APValue RV;
4986-
if (!Evaluator(RV, Args[0], true))
4983+
if (!Evaluator(RV, Args[1], true))
49874984
return true;
49884985

49894986
switch (RV.getReflectionKind()) {
@@ -5001,8 +4998,7 @@ bool bit_offset_of(APValue &Result, ASTContext &C, MetaActions &Meta,
50014998
case ReflectionKind::Declaration: {
50024999
if (FieldDecl *FD = dyn_cast<FieldDecl>(RV.getReflectedDecl())) {
50035000
size_t Offset = getBitOffsetOfField(C, FD) % C.getTypeSize(C.CharTy);
5004-
return SetAndSucceed(Result, APValue(C.MakeIntValue(Offset,
5005-
C.getSizeType())));
5001+
return SetAndSucceed(Result, APValue(C.MakeIntValue(Offset, ResultTy)));
50065002
}
50075003
return DiagnoseReflectionKind(Diagnoser, Range, "a non-static data member",
50085004
DescriptionOf(RV));

libcxx/include/experimental/meta

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,14 @@ template <reflection_range R = initializer_list<info>>
165165
consteval auto define_aggregate(info class_type, R &&members) -> info;
166166
167167
// data layout
168-
struct member_offsets {
169-
size_t bytes;
170-
size_t bits;
168+
struct member_offset {
169+
ptrdiff_t bytes;
170+
ptrdiff_t bits;
171171
172172
constexpr size_t total_bits() const;
173-
auto operator<=>(member_offsets const&) const = default;
173+
auto operator<=>(member_offset const&) const = default;
174174
};
175-
consteval auto offset_of(info) -> member_offsets;
175+
consteval auto offset_of(info) -> member_offset;
176176
consteval auto size_of(info) -> size_t;
177177
consteval auto alignment_of(info) -> size_t;
178178
consteval auto bit_size_of(info) -> size_t;
@@ -1543,22 +1543,22 @@ consteval auto define_aggregate(info class_type, R &&members) -> info {
15431543
}
15441544
}
15451545

1546-
struct member_offsets {
1547-
size_t bytes;
1548-
size_t bits;
1546+
struct member_offset {
1547+
ptrdiff_t bytes;
1548+
ptrdiff_t bits;
15491549

1550-
constexpr auto total_bits() -> size_t {
1550+
constexpr auto total_bits() -> ptrdiff_t {
15511551
return bytes * CHAR_BIT + bits;
15521552
}
15531553

1554-
auto operator<=>(member_offsets const&) const = default;
1554+
auto operator<=>(member_offset const&) const = default;
15551555
};
15561556

15571557
// Returns the offset of the reflected entity.
1558-
consteval auto offset_of(info r) -> member_offsets {
1559-
return member_offsets {
1560-
__metafunction(detail::__metafn_offset_of, r),
1561-
__metafunction(detail::__metafn_bit_offset_of, r)
1558+
consteval auto offset_of(info r) -> member_offset {
1559+
return member_offset {
1560+
__metafunction(detail::__metafn_offset_of, ^^ptrdiff_t, r),
1561+
__metafunction(detail::__metafn_bit_offset_of, ^^ptrdiff_t, r)
15621562
};
15631563
}
15641564

libcxx/test/std/experimental/reflection/layout.pass.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ static_assert(alignment_of(^^int_alias) == alignof(int));
3535

3636

3737
struct S1 { char mem; };
38-
static_assert(offset_of(^^S1::mem) == std::meta::member_offsets{0, 0});
38+
static_assert(offset_of(^^S1::mem) == std::meta::member_offset{0, 0});
3939
static_assert(size_of(^^S1::mem) == 1);
4040
static_assert(bit_size_of(^^S1::mem) == 8);
4141
static_assert(size_of(^^S1) == 1);
@@ -48,12 +48,12 @@ struct BitField {
4848
char bf3 : 3;
4949
int bf4 : 3;
5050
};
51-
static_assert(offset_of(^^BitField::bf1) == std::meta::member_offsets{0, 0});
52-
static_assert(offset_of(^^BitField::bf2) == std::meta::member_offsets{0, 1});
51+
static_assert(offset_of(^^BitField::bf1) == std::meta::member_offset{0, 0});
52+
static_assert(offset_of(^^BitField::bf2) == std::meta::member_offset{0, 1});
5353
static_assert(offset_of(nonstatic_data_members_of(^^BitField)[2]) ==
54-
std::meta::member_offsets{1, 0});
55-
static_assert(offset_of(^^BitField::bf3) == std::meta::member_offsets{1, 0});
56-
static_assert(offset_of(^^BitField::bf4) == std::meta::member_offsets{1, 3});
54+
std::meta::member_offset{1, 0});
55+
static_assert(offset_of(^^BitField::bf3) == std::meta::member_offset{1, 0});
56+
static_assert(offset_of(^^BitField::bf4) == std::meta::member_offset{1, 3});
5757
static_assert(bit_size_of(^^BitField::bf1) == 1);
5858
static_assert(bit_size_of(^^BitField::bf2) == 2);
5959
static_assert(bit_size_of((members_of(^^BitField) |
@@ -86,10 +86,10 @@ static_assert(alignment_of(^^Align::a4) == 4);
8686
static_assert(alignment_of(^^Align::a8) == 8);
8787
static_assert(alignment_of(^^Align::r1) == 16);
8888
static_assert(alignment_of(^^Align) == 16);
89-
static_assert(offset_of(^^Align::a1) == std::meta::member_offsets{0, 0});
90-
static_assert(offset_of(^^Align::a2) == std::meta::member_offsets{2, 0});
91-
static_assert(offset_of(^^Align::a4) == std::meta::member_offsets{4, 0});
92-
static_assert(offset_of(^^Align::a8) == std::meta::member_offsets{8, 0});
89+
static_assert(offset_of(^^Align::a1) == std::meta::member_offset{0, 0});
90+
static_assert(offset_of(^^Align::a2) == std::meta::member_offset{2, 0});
91+
static_assert(offset_of(^^Align::a4) == std::meta::member_offset{4, 0});
92+
static_assert(offset_of(^^Align::a8) == std::meta::member_offset{8, 0});
9393
static_assert(size_of(^^Align::a1) == sizeof(char));
9494
static_assert(size_of(^^Align::a2) == sizeof(char));
9595
static_assert(size_of(^^Align::a4) == sizeof(char));

libcxx/test/std/experimental/reflection/p2996-ex-getting-class-layout.pass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ consteval auto get_layout() {
3737
std::array<member_descriptor, sz> layout;
3838
for (int i = 0; i < members.size(); ++i) {
3939
layout[i] = {
40-
.offset=offset_of(members[i]).bytes,
40+
.offset=static_cast<std::size_t>(offset_of(members[i]).bytes),
4141
.size=size_of(members[i])
4242
};
4343
}

0 commit comments

Comments
 (0)