diff options
author | Saar Raz <saar@raz.email> | 2019-12-06 01:30:21 +0200 |
---|---|---|
committer | Saar Raz <saar@raz.email> | 2019-12-06 01:34:20 +0200 |
commit | fdf80e86a52849813d05da4b6c25884c06ba9e98 (patch) | |
tree | f08ca57be85567d41a118bedb588a8152763c360 /clang/lib/Serialization/ASTWriterStmt.cpp | |
parent | 7faa8440440f280912c33a27c14c0dc4031532de (diff) | |
download | bcm5719-llvm-fdf80e86a52849813d05da4b6c25884c06ba9e98.tar.gz bcm5719-llvm-fdf80e86a52849813d05da4b6c25884c06ba9e98.zip |
[Concepts] Constraint Enforcement & Diagnostics
Part of the C++20 concepts implementation effort.
- Associated constraints (requires clauses, currently) are now enforced when instantiating/specializing templates and when considering partial specializations and function overloads.
- Elaborated diagnostics give helpful insight as to why the constraints were not satisfied.
Phabricator: D41569
Re-commit, after fixing some memory bugs.
Diffstat (limited to 'clang/lib/Serialization/ASTWriterStmt.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTWriterStmt.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 2b331a97985..1e801d02afc 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -401,7 +401,25 @@ void ASTStmtWriter::VisitConceptSpecializationExpr( Record.AddASTTemplateArgumentListInfo(E->getTemplateArgsAsWritten()); for (const TemplateArgument &Arg : TemplateArgs) Record.AddTemplateArgument(Arg); - Record.push_back(E->isSatisfied()); + const ASTConstraintSatisfaction &Satisfaction = E->getSatisfaction(); + Record.push_back(Satisfaction.IsSatisfied); + if (!Satisfaction.IsSatisfied) { + Record.push_back(Satisfaction.NumRecords); + for (const auto &DetailRecord : Satisfaction) { + Record.AddStmt(const_cast<Expr *>(DetailRecord.first)); + auto *E = DetailRecord.second.dyn_cast<Expr *>(); + Record.push_back(E == nullptr); + if (E) + Record.AddStmt(E); + else { + auto *Diag = DetailRecord.second.get<std::pair<SourceLocation, + StringRef> *>(); + Record.AddSourceLocation(Diag->first); + Record.AddString(Diag->second); + } + } + } + Code = serialization::EXPR_CONCEPT_SPECIALIZATION; } |