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

Reply via email to