@@ -785,29 +785,22 @@ void ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
785785 E->setRParenLoc (readSourceLocation ());
786786}
787787
788- static StringRef saveStrToCtx (const std::string &S, ASTContext &Ctx) {
789- char *Buf = new (Ctx) char [S.size ()];
790- std::copy (S.begin (), S.end (), Buf);
791- return StringRef (Buf, S.size ());
792- }
793-
794788static ConstraintSatisfaction
795789readConstraintSatisfaction (ASTRecordReader &Record) {
796790 ConstraintSatisfaction Satisfaction;
797791 Satisfaction.IsSatisfied = Record.readInt ();
798792 Satisfaction.ContainsErrors = Record.readInt ();
793+ const ASTContext &C = Record.getContext ();
799794 if (!Satisfaction.IsSatisfied ) {
800795 unsigned NumDetailRecords = Record.readInt ();
801796 for (unsigned i = 0 ; i != NumDetailRecords; ++i) {
802797 if (/* IsDiagnostic */ Record.readInt ()) {
803798 SourceLocation DiagLocation = Record.readSourceLocation ();
804- StringRef DiagMessage =
805- saveStrToCtx (Record.readString (), Record.getContext ());
799+ StringRef DiagMessage = C.backupStr (Record.readString ());
806800
807801 Satisfaction.Details .emplace_back (
808- new (Record.getContext ())
809- ConstraintSatisfaction::SubstitutionDiagnostic (DiagLocation,
810- DiagMessage));
802+ new (C) ConstraintSatisfaction::SubstitutionDiagnostic (
803+ DiagLocation, DiagMessage));
811804 } else
812805 Satisfaction.Details .emplace_back (Record.readExpr ());
813806 }
@@ -828,12 +821,10 @@ void ASTStmtReader::VisitConceptSpecializationExpr(
828821
829822static concepts::Requirement::SubstitutionDiagnostic *
830823readSubstitutionDiagnostic (ASTRecordReader &Record) {
831- StringRef SubstitutedEntity =
832- saveStrToCtx (Record.readString (), Record.getContext ());
833-
824+ const ASTContext &C = Record.getContext ();
825+ StringRef SubstitutedEntity = C.backupStr (Record.readString ());
834826 SourceLocation DiagLoc = Record.readSourceLocation ();
835- StringRef DiagMessage =
836- saveStrToCtx (Record.readString (), Record.getContext ());
827+ StringRef DiagMessage = C.backupStr (Record.readString ());
837828
838829 return new (Record.getContext ())
839830 concepts::Requirement::SubstitutionDiagnostic{SubstitutedEntity, DiagLoc,
@@ -919,22 +910,21 @@ void ASTStmtReader::VisitRequiresExpr(RequiresExpr *E) {
919910 std::move (*Req));
920911 } break ;
921912 case concepts::Requirement::RK_Nested: {
913+ ASTContext &C = Record.getContext ();
922914 bool HasInvalidConstraint = Record.readInt ();
923915 if (HasInvalidConstraint) {
924- StringRef InvalidConstraint =
925- saveStrToCtx (Record.readString (), Record.getContext ());
926- R = new (Record.getContext ()) concepts::NestedRequirement (
916+ StringRef InvalidConstraint = C.backupStr (Record.readString ());
917+ R = new (C) concepts::NestedRequirement (
927918 Record.getContext (), InvalidConstraint,
928919 readConstraintSatisfaction (Record));
929920 break ;
930921 }
931922 Expr *E = Record.readExpr ();
932923 if (E->isInstantiationDependent ())
933- R = new (Record. getContext () ) concepts::NestedRequirement (E);
924+ R = new (C ) concepts::NestedRequirement (E);
934925 else
935- R = new (Record.getContext ())
936- concepts::NestedRequirement (Record.getContext (), E,
937- readConstraintSatisfaction (Record));
926+ R = new (C) concepts::NestedRequirement (
927+ C, E, readConstraintSatisfaction (Record));
938928 } break ;
939929 }
940930 if (!R)
0 commit comments