diff options
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 67 |
1 files changed, 0 insertions, 67 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index ff18e094bda..ec01b04fcf9 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -8302,8 +8302,6 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T, DiagnoseNullConversion(S, E, T, CC); - S.DiscardMisalignedMemberAddress(Target, E); - if (!Source->isIntegerType() || !Target->isIntegerType()) return; @@ -9373,7 +9371,6 @@ void Sema::CheckCompletedExpr(Expr *E, SourceLocation CheckLoc, CheckUnsequencedOperations(E); if (!IsConstexpr && !E->isValueDependent()) CheckForIntOverflow(E); - DiagnoseMisalignedMembers(); } void Sema::CheckBitFieldInitialization(SourceLocation InitLoc, @@ -10919,67 +10916,3 @@ void Sema::CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr, << ArgumentExpr->getSourceRange() << TypeTagExpr->getSourceRange(); } - -void Sema::AddPotentialMisalignedMembers(Expr *E, RecordDecl *RD, ValueDecl *MD, - CharUnits Alignment) { - MisalignedMembers.emplace_back(E, RD, MD, Alignment); -} - -void Sema::DiagnoseMisalignedMembers() { - for (MisalignedMember &m : MisalignedMembers) { - Diag(m.E->getLocStart(), diag::warn_taking_address_of_packed_member) - << m.MD << m.RD << m.E->getSourceRange(); - } - MisalignedMembers.clear(); -} - -void Sema::DiscardMisalignedMemberAddress(const Type *T, Expr *E) { - if (!T->isPointerType()) - return; - if (isa<UnaryOperator>(E) && - cast<UnaryOperator>(E)->getOpcode() == UO_AddrOf) { - auto *Op = cast<UnaryOperator>(E)->getSubExpr()->IgnoreParens(); - if (isa<MemberExpr>(Op)) { - auto MA = std::find(MisalignedMembers.begin(), MisalignedMembers.end(), - MisalignedMember(Op)); - if (MA != MisalignedMembers.end() && - Context.getTypeAlignInChars(T->getPointeeType()) <= MA->Alignment) - MisalignedMembers.erase(MA); - } - } -} - -void Sema::RefersToMemberWithReducedAlignment( - Expr *E, - std::function<void(Expr *, RecordDecl *, ValueDecl *, CharUnits)> Action) { - const auto *ME = dyn_cast<MemberExpr>(E); - while (ME && isa<FieldDecl>(ME->getMemberDecl())) { - QualType BaseType = ME->getBase()->getType(); - if (ME->isArrow()) - BaseType = BaseType->getPointeeType(); - RecordDecl *RD = BaseType->getAs<RecordType>()->getDecl(); - - ValueDecl *MD = ME->getMemberDecl(); - bool ByteAligned = Context.getTypeAlignInChars(MD->getType()).isOne(); - if (ByteAligned) // Attribute packed does not have any effect. - break; - - if (!ByteAligned && - (RD->hasAttr<PackedAttr>() || (MD->hasAttr<PackedAttr>()))) { - CharUnits Alignment = std::min(Context.getTypeAlignInChars(MD->getType()), - Context.getTypeAlignInChars(BaseType)); - // Notify that this expression designates a member with reduced alignment - Action(E, RD, MD, Alignment); - break; - } - ME = dyn_cast<MemberExpr>(ME->getBase()); - } -} - -void Sema::CheckAddressOfPackedMember(Expr *rhs) { - using namespace std::placeholders; - RefersToMemberWithReducedAlignment( - rhs, std::bind(&Sema::AddPotentialMisalignedMembers, std::ref(*this), _1, - _2, _3, _4)); -} - |