Author: Jun Zhang Date: 2022-10-18T21:05:49+08:00 New Revision: 2946b252993d9b4c12479bf318b648bed2c0427a
URL: https://github.com/llvm/llvm-project/commit/2946b252993d9b4c12479bf318b648bed2c0427a DIFF: https://github.com/llvm/llvm-project/commit/2946b252993d9b4c12479bf318b648bed2c0427a.diff LOG: [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 Added: clang/test/SemaCXX/misaligned-member-with-depdent-type.cpp Modified: clang/lib/Sema/SemaChecking.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index c0ecd7b091000..9d8640a6a057a 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -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)))) diff --git a/clang/test/SemaCXX/misaligned-member-with-depdent-type.cpp b/clang/test/SemaCXX/misaligned-member-with-depdent-type.cpp new file mode 100644 index 0000000000000..cd4768350bab4 --- /dev/null +++ b/clang/test/SemaCXX/misaligned-member-with-depdent-type.cpp @@ -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; + } +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits