diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/AST/ASTConcept.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/AST/ASTConcept.cpp | 108 |
1 files changed, 77 insertions, 31 deletions
diff --git a/contrib/llvm-project/clang/lib/AST/ASTConcept.cpp b/contrib/llvm-project/clang/lib/AST/ASTConcept.cpp index 549088ad4a8a..b3ec99448b3e 100644 --- a/contrib/llvm-project/clang/lib/AST/ASTConcept.cpp +++ b/contrib/llvm-project/clang/lib/AST/ASTConcept.cpp @@ -1,9 +1,8 @@ //===--- ASTConcept.cpp - Concepts Related AST Data Structures --*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// @@ -14,39 +13,54 @@ #include "clang/AST/ASTConcept.h" #include "clang/AST/ASTContext.h" -#include "clang/AST/Decl.h" -#include "clang/AST/TemplateBase.h" +#include "clang/AST/PrettyPrinter.h" #include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/FoldingSet.h" + using namespace clang; -ASTConstraintSatisfaction::ASTConstraintSatisfaction(const ASTContext &C, - const ConstraintSatisfaction &Satisfaction): - NumRecords{Satisfaction.Details.size()}, - IsSatisfied{Satisfaction.IsSatisfied} { - for (unsigned I = 0; I < NumRecords; ++I) { - auto &Detail = Satisfaction.Details[I]; - if (Detail.second.is<Expr *>()) - new (getTrailingObjects<UnsatisfiedConstraintRecord>() + I) - UnsatisfiedConstraintRecord{Detail.first, - UnsatisfiedConstraintRecord::second_type( - Detail.second.get<Expr *>())}; - else { - auto &SubstitutionDiagnostic = - *Detail.second.get<std::pair<SourceLocation, StringRef> *>(); - unsigned MessageSize = SubstitutionDiagnostic.second.size(); - char *Mem = new (C) char[MessageSize]; - memcpy(Mem, SubstitutionDiagnostic.second.data(), MessageSize); - auto *NewSubstDiag = new (C) std::pair<SourceLocation, StringRef>( - SubstitutionDiagnostic.first, StringRef(Mem, MessageSize)); - new (getTrailingObjects<UnsatisfiedConstraintRecord>() + I) - UnsatisfiedConstraintRecord{Detail.first, - UnsatisfiedConstraintRecord::second_type( - NewSubstDiag)}; - } +namespace { +void CreatUnsatisfiedConstraintRecord( + const ASTContext &C, const UnsatisfiedConstraintRecord &Detail, + UnsatisfiedConstraintRecord *TrailingObject) { + if (Detail.second.is<Expr *>()) + new (TrailingObject) UnsatisfiedConstraintRecord{ + Detail.first, + UnsatisfiedConstraintRecord::second_type(Detail.second.get<Expr *>())}; + else { + auto &SubstitutionDiagnostic = + *Detail.second.get<std::pair<SourceLocation, StringRef> *>(); + unsigned MessageSize = SubstitutionDiagnostic.second.size(); + char *Mem = new (C) char[MessageSize]; + memcpy(Mem, SubstitutionDiagnostic.second.data(), MessageSize); + auto *NewSubstDiag = new (C) std::pair<SourceLocation, StringRef>( + SubstitutionDiagnostic.first, StringRef(Mem, MessageSize)); + new (TrailingObject) UnsatisfiedConstraintRecord{ + Detail.first, UnsatisfiedConstraintRecord::second_type(NewSubstDiag)}; } } +} // namespace + +ASTConstraintSatisfaction::ASTConstraintSatisfaction( + const ASTContext &C, const ConstraintSatisfaction &Satisfaction) + : NumRecords{Satisfaction.Details.size()}, + IsSatisfied{Satisfaction.IsSatisfied}, ContainsErrors{ + Satisfaction.ContainsErrors} { + for (unsigned I = 0; I < NumRecords; ++I) + CreatUnsatisfiedConstraintRecord( + C, Satisfaction.Details[I], + getTrailingObjects<UnsatisfiedConstraintRecord>() + I); +} +ASTConstraintSatisfaction::ASTConstraintSatisfaction( + const ASTContext &C, const ASTConstraintSatisfaction &Satisfaction) + : NumRecords{Satisfaction.NumRecords}, + IsSatisfied{Satisfaction.IsSatisfied}, + ContainsErrors{Satisfaction.ContainsErrors} { + for (unsigned I = 0; I < NumRecords; ++I) + CreatUnsatisfiedConstraintRecord( + C, *(Satisfaction.begin() + I), + getTrailingObjects<UnsatisfiedConstraintRecord>() + I); +} ASTConstraintSatisfaction * ASTConstraintSatisfaction::Create(const ASTContext &C, @@ -58,6 +72,14 @@ ASTConstraintSatisfaction::Create(const ASTContext &C, return new (Mem) ASTConstraintSatisfaction(C, Satisfaction); } +ASTConstraintSatisfaction *ASTConstraintSatisfaction::Rebuild( + const ASTContext &C, const ASTConstraintSatisfaction &Satisfaction) { + std::size_t size = + totalSizeToAlloc<UnsatisfiedConstraintRecord>(Satisfaction.NumRecords); + void *Mem = C.Allocate(size, alignof(ASTConstraintSatisfaction)); + return new (Mem) ASTConstraintSatisfaction(C, Satisfaction); +} + void ConstraintSatisfaction::Profile( llvm::FoldingSetNodeID &ID, const ASTContext &C, const NamedDecl *ConstraintOwner, ArrayRef<TemplateArgument> TemplateArgs) { @@ -66,3 +88,27 @@ void ConstraintSatisfaction::Profile( for (auto &Arg : TemplateArgs) Arg.Profile(ID, C); } + +ConceptReference * +ConceptReference::Create(const ASTContext &C, NestedNameSpecifierLoc NNS, + SourceLocation TemplateKWLoc, + DeclarationNameInfo ConceptNameInfo, + NamedDecl *FoundDecl, ConceptDecl *NamedConcept, + const ASTTemplateArgumentListInfo *ArgsAsWritten) { + return new (C) ConceptReference(NNS, TemplateKWLoc, ConceptNameInfo, + FoundDecl, NamedConcept, ArgsAsWritten); +} + +void ConceptReference::print(llvm::raw_ostream &OS, + const PrintingPolicy &Policy) const { + if (NestedNameSpec) + NestedNameSpec.getNestedNameSpecifier()->print(OS, Policy); + ConceptName.printName(OS, Policy); + if (hasExplicitTemplateArgs()) { + OS << "<"; + // FIXME: Find corresponding parameter for argument + for (auto &ArgLoc : ArgsAsWritten->arguments()) + ArgLoc.getArgument().print(Policy, OS, /*IncludeType*/ false); + OS << ">"; + } +} |