[Clang] Fix crash when checking misaligned member with dependent type

If the type is dependent, we should just discard it and not checking its
alignment as it doesn't exisit yet.
Fixes https://github.com/llvm/llvm-project/issues/58370

Differential Revision: https://reviews.llvm.org/D136018
This commit is contained in:
Jun Zhang 2022-10-18 20:38:30 +08:00
parent e175f99c49
commit 2946b25299
No known key found for this signature in database
GPG Key ID: E19904830B621534
2 changed files with 24 additions and 3 deletions

View File

@ -17387,15 +17387,15 @@ void Sema::DiagnoseMisalignedMembers() {
void Sema::DiscardMisalignedMemberAddress(const Type *T, Expr *E) {
E = E->IgnoreParens();
if (!T->isPointerType() && !T->isIntegerType())
if (!T->isPointerType() && !T->isIntegerType() && !T->isDependentType())
return;
if (isa<UnaryOperator>(E) &&
cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf) {
auto *Op = cast<UnaryOperator>(E)->getSubExpr()->IgnoreParens();
if (isa<MemberExpr>(Op)) {
auto MA = llvm::find(MisalignedMembers, MisalignedMember(Op));
auto *MA = llvm::find(MisalignedMembers, MisalignedMember(Op));
if (MA != MisalignedMembers.end() &&
(T->isIntegerType() ||
(T->isDependentType() || T->isIntegerType() ||
(T->isPointerType() && (T->getPointeeType()->isIncompleteType() ||
Context.getTypeAlignInChars(
T->getPointeeType()) <= MA->Alignment))))

View File

@ -0,0 +1,21 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
struct __attribute__((packed)) {
unsigned options;
template <typename T>
void getOptions() {
(T *)&options;
}
template <typename U>
void getOptions2() {
(U)&options;
}
} s;
struct __attribute__((packed)) { // expected-error {{anonymous structs and classes must be class members}}
unsigned options ;
template <typename T> getOptions() // expected-error {{a type specifier is required for all declarations}}
{
(T *) & options;
}
};