clang  15.0.0git
ASTConcept.h
Go to the documentation of this file.
1 //===--- ASTConcept.h - 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 provides AST data structures related to concepts.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_AST_ASTCONCEPT_H
15 #define LLVM_CLANG_AST_ASTCONCEPT_H
16 
17 #include "clang/AST/Expr.h"
19 #include "llvm/ADT/PointerUnion.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include <utility>
22 
23 namespace clang {
24 class ConceptDecl;
25 
26 /// The result of a constraint satisfaction check, containing the necessary
27 /// information to diagnose an unsatisfied constraint.
28 class ConstraintSatisfaction : public llvm::FoldingSetNode {
29  // The template-like entity that 'owns' the constraint checked here (can be a
30  // constrained entity or a concept).
31  const NamedDecl *ConstraintOwner = nullptr;
33 
34 public:
35 
36  ConstraintSatisfaction() = default;
37 
38  ConstraintSatisfaction(const NamedDecl *ConstraintOwner,
39  ArrayRef<TemplateArgument> TemplateArgs) :
40  ConstraintOwner(ConstraintOwner), TemplateArgs(TemplateArgs.begin(),
41  TemplateArgs.end()) { }
42 
43  using SubstitutionDiagnostic = std::pair<SourceLocation, StringRef>;
44  using Detail = llvm::PointerUnion<Expr *, SubstitutionDiagnostic *>;
45 
46  bool IsSatisfied = false;
47 
48  /// \brief Pairs of unsatisfied atomic constraint expressions along with the
49  /// substituted constraint expr, if the template arguments could be
50  /// substituted into them, or a diagnostic if substitution resulted in an
51  /// invalid expression.
53 
54  void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) {
55  Profile(ID, C, ConstraintOwner, TemplateArgs);
56  }
57 
58  static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C,
59  const NamedDecl *ConstraintOwner,
60  ArrayRef<TemplateArgument> TemplateArgs);
61 };
62 
63 /// Pairs of unsatisfied atomic constraint expressions along with the
64 /// substituted constraint expr, if the template arguments could be
65 /// substituted into them, or a diagnostic if substitution resulted in
66 /// an invalid expression.
68  std::pair<const Expr *,
69  llvm::PointerUnion<Expr *,
70  std::pair<SourceLocation, StringRef> *>>;
71 
72 /// \brief The result of a constraint satisfaction check, containing the
73 /// necessary information to diagnose an unsatisfied constraint.
74 ///
75 /// This is safe to store in an AST node, as opposed to ConstraintSatisfaction.
77  llvm::TrailingObjects<ASTConstraintSatisfaction,
78  UnsatisfiedConstraintRecord> {
80  bool IsSatisfied : 1;
81 
83  return getTrailingObjects<UnsatisfiedConstraintRecord>();
84  }
85 
87  return getTrailingObjects<UnsatisfiedConstraintRecord>() + NumRecords;
88  }
89 
91  const ConstraintSatisfaction &Satisfaction);
92 
94  Create(const ASTContext &C, const ConstraintSatisfaction &Satisfaction);
95 };
96 
97 /// \brief Common data class for constructs that reference concepts with
98 /// template arguments.
100 protected:
101  // \brief The optional nested name specifier used when naming the concept.
103 
104  /// \brief The location of the template keyword, if specified when naming the
105  /// concept.
107 
108  /// \brief The concept name used.
110 
111  /// \brief The declaration found by name lookup when the expression was
112  /// created.
113  /// Can differ from NamedConcept when, for example, the concept was found
114  /// through a UsingShadowDecl.
116 
117  /// \brief The concept named.
119 
120  /// \brief The template argument list source info used to specialize the
121  /// concept.
123 
124 public:
126  DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl,
130  ConceptName(ConceptNameInfo), FoundDecl(FoundDecl),
132 
134  : FoundDecl(nullptr), NamedConcept(nullptr), ArgsAsWritten(nullptr) {}
135 
137  return NestedNameSpec;
138  }
139 
141 
143  return getConceptNameInfo().getLoc();
144  }
145 
147 
149  return FoundDecl;
150  }
151 
153  return NamedConcept;
154  }
155 
157  return ArgsAsWritten;
158  }
159 
160  /// \brief Whether or not template arguments were explicitly specified in the
161  /// concept reference (they might not be in type constraints, for example)
162  bool hasExplicitTemplateArgs() const {
163  return ArgsAsWritten != nullptr;
164  }
165 };
166 
168  /// \brief The immediately-declared constraint expression introduced by this
169  /// type-constraint.
170  Expr *ImmediatelyDeclaredConstraint = nullptr;
171 
172 public:
174  DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl,
177  Expr *ImmediatelyDeclaredConstraint) :
178  ConceptReference(NNS, /*TemplateKWLoc=*/SourceLocation(), ConceptNameInfo,
180  ImmediatelyDeclaredConstraint(ImmediatelyDeclaredConstraint) {}
181 
182  /// \brief Get the immediately-declared constraint expression introduced by
183  /// this type-constraint, that is - the constraint expression that is added to
184  /// the associated constraints of the enclosing declaration in practice.
186  return ImmediatelyDeclaredConstraint;
187  }
188 
189  void print(llvm::raw_ostream &OS, PrintingPolicy Policy) const;
190 };
191 
192 } // clang
193 
194 #endif // LLVM_CLANG_AST_ASTCONCEPT_H
clang::ASTConstraintSatisfaction
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition: ASTConcept.h:76
clang::ConceptReference::ConceptReference
ConceptReference()
Definition: ASTConcept.h:133
llvm::SmallVector
Definition: LLVM.h:38
clang::SourceLocation
Encodes a location in the source.
Definition: SourceLocation.h:86
clang::NamedDecl
This represents a decl that may have a name.
Definition: Decl.h:247
clang::ConceptReference::getNamedConcept
ConceptDecl * getNamedConcept() const
Definition: ASTConcept.h:152
clang::TypeConstraint::getImmediatelyDeclaredConstraint
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
Definition: ASTConcept.h:185
clang::PrintingPolicy
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
clang::ConstraintSatisfaction::Details
llvm::SmallVector< std::pair< const Expr *, Detail >, 4 > Details
Pairs of unsatisfied atomic constraint expressions along with the substituted constraint expr,...
Definition: ASTConcept.h:52
size_t
__SIZE_TYPE__ size_t
The unsigned integer type of the result of the sizeof operator.
Definition: opencl-c-base.h:117
clang::UnsatisfiedConstraintRecord
std::pair< const Expr *, llvm::PointerUnion< Expr *, std::pair< SourceLocation, StringRef > * > > UnsatisfiedConstraintRecord
Pairs of unsatisfied atomic constraint expressions along with the substituted constraint expr,...
Definition: ASTConcept.h:70
clang::ConceptReference::getTemplateArgsAsWritten
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Definition: ASTConcept.h:156
clang::ConceptDecl
Declaration of a C++2a concept.
Definition: DeclTemplate.h:3252
clang::ConstraintSatisfaction::ConstraintSatisfaction
ConstraintSatisfaction()=default
clang::ConceptReference::ConceptName
DeclarationNameInfo ConceptName
The concept name used.
Definition: ASTConcept.h:109
clang::ASTContext
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:208
clang::ConceptReference::NamedConcept
ConceptDecl * NamedConcept
The concept named.
Definition: ASTConcept.h:118
clang::ConceptReference::getTemplateKWLoc
SourceLocation getTemplateKWLoc() const
Definition: ASTConcept.h:146
Expr.h
clang::ConceptReference::hasExplicitTemplateArgs
bool hasExplicitTemplateArgs() const
Whether or not template arguments were explicitly specified in the concept reference (they might not ...
Definition: ASTConcept.h:162
clang::ConceptReference::getFoundDecl
NamedDecl * getFoundDecl() const
Definition: ASTConcept.h:148
clang::TypeConstraint::print
void print(llvm::raw_ostream &OS, PrintingPolicy Policy) const
Definition: DeclTemplate.cpp:1481
clang::NestedNameSpecifierLoc
A C++ nested-name-specifier augmented with source location information.
Definition: NestedNameSpecifier.h:243
clang::ASTConstraintSatisfaction::begin
const UnsatisfiedConstraintRecord * begin() const
Definition: ASTConcept.h:82
clang::ASTConstraintSatisfaction::end
const UnsatisfiedConstraintRecord * end() const
Definition: ASTConcept.h:86
clang::ConstraintSatisfaction::IsSatisfied
bool IsSatisfied
Definition: ASTConcept.h:46
clang::ConceptReference::ArgsAsWritten
const ASTTemplateArgumentListInfo * ArgsAsWritten
The template argument list source info used to specialize the concept.
Definition: ASTConcept.h:122
SourceLocation.h
clang::ConceptReference::NestedNameSpec
NestedNameSpecifierLoc NestedNameSpec
Definition: ASTConcept.h:102
clang::ConstraintSatisfaction::Profile
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C)
Definition: ASTConcept.h:54
clang::ConceptReference
Common data class for constructs that reference concepts with template arguments.
Definition: ASTConcept.h:99
clang::ASTConstraintSatisfaction::IsSatisfied
bool IsSatisfied
Definition: ASTConcept.h:80
llvm::ArrayRef
Definition: LLVM.h:34
clang::ConceptReference::ConceptReference
ConceptReference(NestedNameSpecifierLoc NNS, SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten)
Definition: ASTConcept.h:125
clang::Builtin::ID
ID
Definition: Builtins.h:51
clang::ConceptReference::getConceptNameLoc
SourceLocation getConceptNameLoc() const
Definition: ASTConcept.h:142
clang
Definition: CalledOnceCheck.h:17
clang::TypeConstraint::TypeConstraint
TypeConstraint(NestedNameSpecifierLoc NNS, DeclarationNameInfo ConceptNameInfo, NamedDecl *FoundDecl, ConceptDecl *NamedConcept, const ASTTemplateArgumentListInfo *ArgsAsWritten, Expr *ImmediatelyDeclaredConstraint)
Definition: ASTConcept.h:173
clang::ConstraintSatisfaction::Detail
llvm::PointerUnion< Expr *, SubstitutionDiagnostic * > Detail
Definition: ASTConcept.h:44
clang::ASTConstraintSatisfaction::ASTConstraintSatisfaction
ASTConstraintSatisfaction(const ASTContext &C, const ConstraintSatisfaction &Satisfaction)
Definition: ASTConcept.cpp:22
clang::ConstraintSatisfaction::ConstraintSatisfaction
ConstraintSatisfaction(const NamedDecl *ConstraintOwner, ArrayRef< TemplateArgument > TemplateArgs)
Definition: ASTConcept.h:38
clang::ConstraintSatisfaction::SubstitutionDiagnostic
std::pair< SourceLocation, StringRef > SubstitutionDiagnostic
Definition: ASTConcept.h:43
clang::ConstraintSatisfaction
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition: ASTConcept.h:28
clang::ConceptReference::getNestedNameSpecifierLoc
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
Definition: ASTConcept.h:136
clang::ConceptReference::getConceptNameInfo
const DeclarationNameInfo & getConceptNameInfo() const
Definition: ASTConcept.h:140
clang::ASTTemplateArgumentListInfo
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
Definition: TemplateBase.h:612
clang::ConceptReference::FoundDecl
NamedDecl * FoundDecl
The declaration found by name lookup when the expression was created.
Definition: ASTConcept.h:115
clang::Expr
This represents one expression.
Definition: Expr.h:109
clang::DeclarationNameInfo::getLoc
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
Definition: DeclarationName.h:796
clang::DeclarationNameInfo
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspnd...
Definition: DeclarationName.h:767
clang::ASTConstraintSatisfaction::NumRecords
std::size_t NumRecords
Definition: ASTConcept.h:79
clang::TypeConstraint
Definition: ASTConcept.h:167
clang::ConceptReference::TemplateKWLoc
SourceLocation TemplateKWLoc
The location of the template keyword, if specified when naming the concept.
Definition: ASTConcept.h:106
clang::ASTConstraintSatisfaction::Create
static ASTConstraintSatisfaction * Create(const ASTContext &C, const ConstraintSatisfaction &Satisfaction)
Definition: ASTConcept.cpp:51