mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 13:50:11 +00:00
[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:
parent
e175f99c49
commit
2946b25299
@ -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))))
|
||||
|
21
clang/test/SemaCXX/misaligned-member-with-depdent-type.cpp
Normal file
21
clang/test/SemaCXX/misaligned-member-with-depdent-type.cpp
Normal 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;
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user