diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-24 22:11:32 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-24 22:11:32 +0000 | 
| commit | 8b67a9f01da8048d4ed0a3fefc890e684526cd6a (patch) | |
| tree | 3a477c21c59c764e17d8a794f3e240fc18bb740a /clang/lib/AST/StmtProfile.cpp | |
| parent | d225fe9c6746d065ebe184f96f2cfbafec025668 (diff) | |
Notes
Diffstat (limited to 'clang/lib/AST/StmtProfile.cpp')
| -rw-r--r-- | clang/lib/AST/StmtProfile.cpp | 49 | 
1 files changed, 46 insertions, 3 deletions
| diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp index 2aa5106e90fae..382ea5c8d7ef0 100644 --- a/clang/lib/AST/StmtProfile.cpp +++ b/clang/lib/AST/StmtProfile.cpp @@ -1335,9 +1335,52 @@ void StmtProfiler::VisitAtomicExpr(const AtomicExpr *S) {  void StmtProfiler::VisitConceptSpecializationExpr(                                             const ConceptSpecializationExpr *S) {    VisitExpr(S); -  VisitDecl(S->getFoundDecl()); -  VisitTemplateArguments(S->getTemplateArgsAsWritten()->getTemplateArgs(), -                         S->getTemplateArgsAsWritten()->NumTemplateArgs); +  VisitDecl(S->getNamedConcept()); +  for (const TemplateArgument &Arg : S->getTemplateArguments()) +    VisitTemplateArgument(Arg); +} + +void StmtProfiler::VisitRequiresExpr(const RequiresExpr *S) { +  VisitExpr(S); +  ID.AddInteger(S->getLocalParameters().size()); +  for (ParmVarDecl *LocalParam : S->getLocalParameters()) +    VisitDecl(LocalParam); +  ID.AddInteger(S->getRequirements().size()); +  for (concepts::Requirement *Req : S->getRequirements()) { +    if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) { +      ID.AddInteger(concepts::Requirement::RK_Type); +      ID.AddBoolean(TypeReq->isSubstitutionFailure()); +      if (!TypeReq->isSubstitutionFailure()) +        VisitType(TypeReq->getType()->getType()); +    } else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) { +      ID.AddInteger(concepts::Requirement::RK_Compound); +      ID.AddBoolean(ExprReq->isExprSubstitutionFailure()); +      if (!ExprReq->isExprSubstitutionFailure()) +        Visit(ExprReq->getExpr()); +      // C++2a [expr.prim.req.compound]p1 Example: +      //    [...] The compound-requirement in C1 requires that x++ is a valid +      //    expression. It is equivalent to the simple-requirement x++; [...] +      // We therefore do not profile isSimple() here. +      ID.AddBoolean(ExprReq->getNoexceptLoc().isValid()); +      const concepts::ExprRequirement::ReturnTypeRequirement &RetReq = +          ExprReq->getReturnTypeRequirement(); +      if (RetReq.isEmpty()) { +        ID.AddInteger(0); +      } else if (RetReq.isTypeConstraint()) { +        ID.AddInteger(1); +        Visit(RetReq.getTypeConstraint()->getImmediatelyDeclaredConstraint()); +      } else { +        assert(RetReq.isSubstitutionFailure()); +        ID.AddInteger(2); +      } +    } else { +      ID.AddInteger(concepts::Requirement::RK_Nested); +      auto *NestedReq = cast<concepts::NestedRequirement>(Req); +      ID.AddBoolean(NestedReq->isSubstitutionFailure()); +      if (!NestedReq->isSubstitutionFailure())   +        Visit(NestedReq->getConstraintExpr()); +    } +  }  }  static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S, | 
