Skip to content

Commit 5658d85

Browse files
committed
[Sema] Teach -Wcast-align to compute alignment of CXXThisExpr
This fixes https://bugs.llvm.org/show_bug.cgi?id=46605. rdar://problem/65158878 Differential Revision: https://reviews.llvm.org/D83317 (cherry picked from commit 0402705)
1 parent fcb37a1 commit 5658d85

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

clang/lib/Sema/SemaChecking.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13742,12 +13742,14 @@ static getBaseAlignmentAndOffsetFromLValue(const Expr *E, ASTContext &Ctx) {
1374213742
}
1374313743
case Stmt::MemberExprClass: {
1374413744
auto *ME = cast<MemberExpr>(E);
13745-
if (ME->isArrow())
13746-
break;
1374713745
auto *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
1374813746
if (!FD || FD->getType()->isReferenceType())
1374913747
break;
13750-
auto P = getBaseAlignmentAndOffsetFromLValue(ME->getBase(), Ctx);
13748+
Optional<std::pair<CharUnits, CharUnits>> P;
13749+
if (ME->isArrow())
13750+
P = getBaseAlignmentAndOffsetFromPtr(ME->getBase(), Ctx);
13751+
else
13752+
P = getBaseAlignmentAndOffsetFromLValue(ME->getBase(), Ctx);
1375113753
if (!P)
1375213754
break;
1375313755
const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(FD->getParent());
@@ -13811,6 +13813,11 @@ static getBaseAlignmentAndOffsetFromPtr(const Expr *E, ASTContext &Ctx) {
1381113813
}
1381213814
break;
1381313815
}
13816+
case Stmt::CXXThisExprClass: {
13817+
auto *RD = E->getType()->getPointeeType()->getAsCXXRecordDecl();
13818+
CharUnits Alignment = Ctx.getASTRecordLayout(RD).getNonVirtualAlignment();
13819+
return std::make_pair(Alignment, CharUnits::Zero());
13820+
}
1381413821
case Stmt::UnaryOperatorClass: {
1381513822
auto *UO = cast<UnaryOperator>(E);
1381613823
if (UO->getOpcode() == UO_AddrOf)

clang/test/SemaCXX/warn-cast-align.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,16 @@ void test1(void *P) {
4444
c = IntPtr(P);
4545
}
4646

47+
struct __attribute__((aligned(16))) AlignedS {
48+
char m[16];
49+
};
50+
4751
struct __attribute__((aligned(16))) A {
4852
char m0[16];
4953
char m1[16];
54+
AlignedS *getAlignedS() {
55+
return (AlignedS *)m1;
56+
}
5057
};
5158

5259
struct B0 {
@@ -92,6 +99,9 @@ struct __attribute__((aligned(16))) D4 : virtual D2 {
9299

93100
struct D5 : virtual D0 {
94101
char m0[16];
102+
AlignedS *get() {
103+
return (AlignedS *)m0; // expected-warning {{cast from 'char *' to 'AlignedS *'}}
104+
}
95105
};
96106

97107
struct D6 : virtual D5 {

0 commit comments

Comments
 (0)