10 #include "clang/AST/ASTContext.h" 11 #include "clang/ASTMatchers/ASTMatchFinder.h" 20 return Node.getNumPlacementArgs() > 0;
23 void DefaultOperatorNewAlignmentCheck::registerMatchers(MatchFinder *Finder) {
25 if (getLangOpts().CPlusPlus17)
28 Finder->addMatcher(cxxNewExpr(unless(isPlacementNew())).bind(
"new"),
this);
31 void DefaultOperatorNewAlignmentCheck::check(
32 const MatchFinder::MatchResult &Result) {
34 const auto *NewExpr = Result.Nodes.getNodeAs<CXXNewExpr>(
"new");
36 QualType T = NewExpr->getAllocatedType();
38 if (T->isDependentType())
40 const TagDecl *D = T->getAsTagDecl();
42 if (!D || !D->getDefinition() || !D->isCompleteDefinition())
45 ASTContext &Context = D->getASTContext();
48 if (!Context.isAlignmentRequired(T))
52 unsigned SpecifiedAlignment = D->getMaxAlignment();
54 if (!SpecifiedAlignment)
57 unsigned DefaultNewAlignment = Context.getTargetInfo().getNewAlign();
59 bool OverAligned = SpecifiedAlignment > DefaultNewAlignment;
60 bool HasDefaultOperatorNew =
61 !NewExpr->getOperatorNew() || NewExpr->getOperatorNew()->isImplicit();
63 unsigned CharWidth = Context.getTargetInfo().getCharWidth();
64 if (HasDefaultOperatorNew && OverAligned)
65 diag(NewExpr->getBeginLoc(),
66 "allocation function returns a pointer with alignment %0 but the " 67 "over-aligned type being allocated requires alignment %1")
68 << (DefaultNewAlignment / CharWidth)
69 << (SpecifiedAlignment / CharWidth);
AST_MATCHER(Expr, isMacroID)
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//