diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -17393,12 +17393,13 @@ cast(E)->getOpcode() == UO_AddrOf) { auto *Op = cast(E)->getSubExpr()->IgnoreParens(); if (isa(Op)) { - auto MA = llvm::find(MisalignedMembers, MisalignedMember(Op)); + auto *MA = llvm::find(MisalignedMembers, MisalignedMember(Op)); + const bool IsDiscardMisalignedPointer = + T->isPointerType() && + (T->getPointeeType()->isIncompleteType() || T->isDependentType() || + Context.getTypeAlignInChars(T->getPointeeType()) <= MA->Alignment); if (MA != MisalignedMembers.end() && - (T->isIntegerType() || - (T->isPointerType() && (T->getPointeeType()->isIncompleteType() || - Context.getTypeAlignInChars( - T->getPointeeType()) <= MA->Alignment)))) + (T->isIntegerType() || IsDiscardMisalignedPointer)) MisalignedMembers.erase(MA); } } 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 --- /dev/null +++ b/clang/test/SemaCXX/misaligned-member-with-depdent-type.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// expected-no-diagnostics +struct __attribute__((packed)) { + unsigned options; + template + void getOptions() { + (T *)&options; + } +} s;