diff options
Diffstat (limited to 'clang/lib/AST/TypeLoc.cpp')
| -rw-r--r-- | clang/lib/AST/TypeLoc.cpp | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/clang/lib/AST/TypeLoc.cpp b/clang/lib/AST/TypeLoc.cpp index 69efa6fecbc4..e12b9b50f6e7 100644 --- a/clang/lib/AST/TypeLoc.cpp +++ b/clang/lib/AST/TypeLoc.cpp @@ -11,9 +11,10 @@ //===----------------------------------------------------------------------===// #include "clang/AST/TypeLoc.h" -#include "clang/AST/DeclTemplate.h" +#include "clang/AST/ASTConcept.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" #include "clang/AST/NestedNameSpecifier.h" #include "clang/AST/TemplateBase.h" @@ -621,25 +622,43 @@ void TemplateSpecializationTypeLoc::initializeArgLocs( } } -DeclarationNameInfo AutoTypeLoc::getConceptNameInfo() const { - return DeclarationNameInfo(getNamedConcept()->getDeclName(), - getLocalData()->ConceptNameLoc); +// Builds a ConceptReference where all locations point at the same token, +// for use in trivial TypeSourceInfo for constrained AutoType +static ConceptReference *createTrivialConceptReference(ASTContext &Context, + SourceLocation Loc, + const AutoType *AT) { + DeclarationNameInfo DNI = + DeclarationNameInfo(AT->getTypeConstraintConcept()->getDeclName(), Loc, + AT->getTypeConstraintConcept()->getDeclName()); + unsigned size = AT->getTypeConstraintArguments().size(); + TemplateArgumentLocInfo *TALI = new TemplateArgumentLocInfo[size]; + TemplateSpecializationTypeLoc::initializeArgLocs( + Context, AT->getTypeConstraintArguments(), TALI, Loc); + TemplateArgumentListInfo TAListI; + for (unsigned i = 0; i < size; ++i) { + TAListI.addArgument( + TemplateArgumentLoc(AT->getTypeConstraintArguments()[i], + TALI[i])); // TemplateArgumentLocInfo() + } + + auto *ConceptRef = ConceptReference::Create( + Context, NestedNameSpecifierLoc{}, Loc, DNI, nullptr, + AT->getTypeConstraintConcept(), + ASTTemplateArgumentListInfo::Create(Context, TAListI)); + delete[] TALI; + return ConceptRef; } void AutoTypeLoc::initializeLocal(ASTContext &Context, SourceLocation Loc) { - setNestedNameSpecifierLoc(NestedNameSpecifierLoc()); - setTemplateKWLoc(Loc); - setConceptNameLoc(Loc); - setFoundDecl(nullptr); - setRAngleLoc(Loc); - setLAngleLoc(Loc); setRParenLoc(Loc); - TemplateSpecializationTypeLoc::initializeArgLocs( - Context, getTypePtr()->getTypeConstraintArguments(), getArgInfos(), Loc); setNameLoc(Loc); + setConceptReference(nullptr); + if (getTypePtr()->isConstrained()) { + setConceptReference( + createTrivialConceptReference(Context, Loc, getTypePtr())); + } } - namespace { class GetContainedAutoTypeLocVisitor : |
