================ @@ -2249,6 +2249,53 @@ Value *ScalarExprEmitter::VisitInitListExpr(InitListExpr *E) { return V; } +static bool isDeclRefKnownNonNull(CodeGenFunction &CGF, const ValueDecl *D) { + return !D->isWeak(); +} + +static bool isLValueKnownNonNull(CodeGenFunction &CGF, const Expr *E) { + E = E->IgnoreParens(); + + if (const auto *UO = dyn_cast<UnaryOperator>(E)) + if (UO->getOpcode() == UO_Deref) + return CGF.isPointerKnownNonNull(UO->getSubExpr()); + + if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) + return isDeclRefKnownNonNull(CGF, DRE->getDecl()); + + if (const auto *ME = dyn_cast<MemberExpr>(E)) { + if (isa<FieldDecl>(ME->getMemberDecl())) + return true; + return isDeclRefKnownNonNull(CGF, ME->getMemberDecl()); + } + + // Array subscripts? Anything else? + + return false; +} + +bool CodeGenFunction::isPointerKnownNonNull(const Expr *E) { + assert(E->getType()->isSignableType()); + + E = E->IgnoreParens(); + + if (isa<CXXThisExpr>(E)) + return true; + + if (const auto *UO = dyn_cast<UnaryOperator>(E)) + if (UO->getOpcode() == UO_AddrOf) + return isLValueKnownNonNull(*this, UO->getSubExpr()); + + if (const auto *CE = dyn_cast<CastExpr>(E)) + if (CE->getCastKind() == CK_FunctionToPointerDecay || + CE->getCastKind() == CK_ArrayToPointerDecay) + return isLValueKnownNonNull(*this, CE->getSubExpr()); + + // Maybe honor __nonnull? ---------------- ahatanak wrote:
I will file an issue after this PR is merged. https://github.com/llvm/llvm-project/pull/100830 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits