eandrews created this revision. eandrews added reviewers: tahonermann, aaron.ballman. Herald added subscribers: manas, ASDenysPetrov, dkrupp, donat.nagy, Szelethus, a.sidorin, baloghadamsoftware. Herald added a project: All. eandrews requested review of this revision. Herald added a subscriber: wangpc.
Param->getTypeConstraint() can return nullptr, and was dereferenced without a check. I followed the logic for invalid constraints and set Status as concepts::ExprRequirement::SS_ExprSubstitutionFailure if getTypeConstraint() returns null unexpectedly. I am not a 100% certain about this change since I am unfamiliar with concepts. https://reviews.llvm.org/D157554 Files: clang/lib/Sema/SemaExprCXX.cpp Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -9072,15 +9072,20 @@ MultiLevelTemplateArgumentList MLTAL(Param, TAL.asArray(), /*Final=*/false); MLTAL.addOuterRetainedLevels(TPL->getDepth()); - Expr *IDC = Param->getTypeConstraint()->getImmediatelyDeclaredConstraint(); - ExprResult Constraint = SubstExpr(IDC, MLTAL); - if (Constraint.isInvalid()) { + const TypeConstraint *TC = Param->getTypeConstraint(); + if (!TC) { Status = concepts::ExprRequirement::SS_ExprSubstitutionFailure; } else { - SubstitutedConstraintExpr = - cast<ConceptSpecializationExpr>(Constraint.get()); - if (!SubstitutedConstraintExpr->isSatisfied()) - Status = concepts::ExprRequirement::SS_ConstraintsNotSatisfied; + ExprResult Constraint = + SubstExpr(TC->getImmediatelyDeclaredConstraint(), MLTAL); + if (Constraint.isInvalid()) { + Status = concepts::ExprRequirement::SS_ExprSubstitutionFailure; + } else { + SubstitutedConstraintExpr = + cast<ConceptSpecializationExpr>(Constraint.get()); + if (!SubstitutedConstraintExpr->isSatisfied()) + Status = concepts::ExprRequirement::SS_ConstraintsNotSatisfied; + } } } return new (Context) concepts::ExprRequirement(E, IsSimple, NoexceptLoc,
Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -9072,15 +9072,20 @@ MultiLevelTemplateArgumentList MLTAL(Param, TAL.asArray(), /*Final=*/false); MLTAL.addOuterRetainedLevels(TPL->getDepth()); - Expr *IDC = Param->getTypeConstraint()->getImmediatelyDeclaredConstraint(); - ExprResult Constraint = SubstExpr(IDC, MLTAL); - if (Constraint.isInvalid()) { + const TypeConstraint *TC = Param->getTypeConstraint(); + if (!TC) { Status = concepts::ExprRequirement::SS_ExprSubstitutionFailure; } else { - SubstitutedConstraintExpr = - cast<ConceptSpecializationExpr>(Constraint.get()); - if (!SubstitutedConstraintExpr->isSatisfied()) - Status = concepts::ExprRequirement::SS_ConstraintsNotSatisfied; + ExprResult Constraint = + SubstExpr(TC->getImmediatelyDeclaredConstraint(), MLTAL); + if (Constraint.isInvalid()) { + Status = concepts::ExprRequirement::SS_ExprSubstitutionFailure; + } else { + SubstitutedConstraintExpr = + cast<ConceptSpecializationExpr>(Constraint.get()); + if (!SubstitutedConstraintExpr->isSatisfied()) + Status = concepts::ExprRequirement::SS_ConstraintsNotSatisfied; + } } } return new (Context) concepts::ExprRequirement(E, IsSimple, NoexceptLoc,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits