clang 20.0.0git
ASTConcept.cpp
Go to the documentation of this file.
1//===--- ASTConcept.cpp - Concepts Related AST Data Structures --*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// \brief This file defines AST data structures related to concepts.
11///
12//===----------------------------------------------------------------------===//
13
17#include "llvm/ADT/StringExtras.h"
18
19using namespace clang;
20
21static void
23 const UnsatisfiedConstraintRecord &Detail,
24 UnsatisfiedConstraintRecord *TrailingObject) {
25 if (auto *E = dyn_cast<Expr *>(Detail))
26 new (TrailingObject) UnsatisfiedConstraintRecord(E);
27 else {
28 auto &SubstitutionDiagnostic =
29 *cast<std::pair<SourceLocation, StringRef> *>(Detail);
30 StringRef Message = C.backupStr(SubstitutionDiagnostic.second);
31 auto *NewSubstDiag = new (C) std::pair<SourceLocation, StringRef>(
32 SubstitutionDiagnostic.first, Message);
33 new (TrailingObject) UnsatisfiedConstraintRecord(NewSubstDiag);
34 }
35}
36
38 const ASTContext &C, const ConstraintSatisfaction &Satisfaction)
39 : NumRecords{Satisfaction.Details.size()},
40 IsSatisfied{Satisfaction.IsSatisfied}, ContainsErrors{
41 Satisfaction.ContainsErrors} {
42 for (unsigned I = 0; I < NumRecords; ++I)
44 C, Satisfaction.Details[I],
45 getTrailingObjects<UnsatisfiedConstraintRecord>() + I);
46}
47
49 const ASTContext &C, const ASTConstraintSatisfaction &Satisfaction)
50 : NumRecords{Satisfaction.NumRecords},
51 IsSatisfied{Satisfaction.IsSatisfied},
52 ContainsErrors{Satisfaction.ContainsErrors} {
53 for (unsigned I = 0; I < NumRecords; ++I)
55 C, *(Satisfaction.begin() + I),
56 getTrailingObjects<UnsatisfiedConstraintRecord>() + I);
57}
58
61 const ConstraintSatisfaction &Satisfaction) {
62 std::size_t size =
63 totalSizeToAlloc<UnsatisfiedConstraintRecord>(
64 Satisfaction.Details.size());
65 void *Mem = C.Allocate(size, alignof(ASTConstraintSatisfaction));
66 return new (Mem) ASTConstraintSatisfaction(C, Satisfaction);
67}
68
70 const ASTContext &C, const ASTConstraintSatisfaction &Satisfaction) {
71 std::size_t size =
72 totalSizeToAlloc<UnsatisfiedConstraintRecord>(Satisfaction.NumRecords);