From a2548ff890dafc67941ab35954abf237b03905f3 Mon Sep 17 00:00:00 2001 From: Barry Revzin Date: Fri, 13 Jun 2025 06:52:18 -0500 Subject: [PATCH] Fixing alignment_of references members (#153) --- clang/lib/AST/ExprConstantMeta.cpp | 3 +-- libcxx/test/std/experimental/reflection/layout.pass.cpp | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/lib/AST/ExprConstantMeta.cpp b/clang/lib/AST/ExprConstantMeta.cpp index 2db7c2e3997a..3ea0450e5572 100644 --- a/clang/lib/AST/ExprConstantMeta.cpp +++ b/clang/lib/AST/ExprConstantMeta.cpp @@ -5344,13 +5344,12 @@ bool alignment_of(APValue &Result, ASTContext &C, MetaActions &Meta, } case ReflectionKind::Declaration: { const ValueDecl *VD = cast(RV.getReflectedDecl()); - size_t Align = C.getTypeAlignInChars(VD->getType()).getQuantity(); if (const FieldDecl *FD = dyn_cast(VD)) { if (FD->isBitField()) return true; } - Align = C.getDeclAlign(VD, true).getQuantity(); + size_t Align = C.getDeclAlign(VD, false).getQuantity(); return SetAndSucceed(Result, APValue(C.MakeIntValue(Align, C.getSizeType()))); diff --git a/libcxx/test/std/experimental/reflection/layout.pass.cpp b/libcxx/test/std/experimental/reflection/layout.pass.cpp index 7bba485a49b8..3b9d6839c81e 100644 --- a/libcxx/test/std/experimental/reflection/layout.pass.cpp +++ b/libcxx/test/std/experimental/reflection/layout.pass.cpp @@ -88,12 +88,14 @@ struct Align { alignas(8) char a8; alignas(16) int &r1; + int &r2; }; static_assert(alignment_of(^^Align::a1) == 1); static_assert(alignment_of(^^Align::a2) == 2); static_assert(alignment_of(^^Align::a4) == 4); static_assert(alignment_of(^^Align::a8) == 8); static_assert(alignment_of(^^Align::r1) == 16); +static_assert(alignment_of(^^Align::r2) == 8); static_assert(alignment_of(^^Align) == 16); static_assert(offset_of(^^Align::a1) == std::meta::member_offset{0, 0}); static_assert(offset_of(^^Align::a2) == std::meta::member_offset{2, 0});