Skip to content

Commit

Permalink
fix merge
Browse files Browse the repository at this point in the history
  • Loading branch information
cor3ntin committed Oct 2, 2024
1 parent 58cedbb commit b93e741
Show file tree
Hide file tree
Showing 12 changed files with 84 additions and 234 deletions.
7 changes: 5 additions & 2 deletions clang/include/clang/AST/DeclTemplate.h
Original file line number Diff line number Diff line change
Expand Up @@ -1612,11 +1612,12 @@ class TemplateTemplateParmDecl final
: TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
TemplateParmPosition(D, P), Typename(Typename),
ParameterPack(ParameterPack),
ParameterKind(ParameterKind), ExpandedParameterPack(false) {}
ExpandedParameterPack(false), ParameterKind(ParameterKind) {}

TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L, unsigned D,
unsigned P, IdentifierInfo *Id,
TemplateNameKind ParameterKind,
bool Typename,
TemplateParameterList *Params,
ArrayRef<TemplateParameterList *> Expansions);

Expand All @@ -1635,7 +1636,9 @@ class TemplateTemplateParmDecl final

static TemplateTemplateParmDecl *
Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D,
unsigned P, IdentifierInfo *Id, bool Typename, TemplateNameKind ParameterKind,
unsigned P, IdentifierInfo *Id,
TemplateNameKind ParameterKind,
bool Typename,
TemplateParameterList *Params,
ArrayRef<TemplateParameterList *> Expansions);

Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Basic/DiagnosticSemaKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -5269,7 +5269,7 @@ def err_partial_concept_valid_template : Error<
"name of template argument does not refer to concept, or concept "
"template parameter">;
def err_partial_concept_param_must_have_one_arg : Error<
"The corresponding template parameter of a partially applied concept must have exactly one argument">;
"the corresponding template parameter of a partially applied concept must have exactly one argument">;
def note_concept_template_parameter_declared_here : Error<
"concept template parameter declared here">;

Expand Down
13 changes: 7 additions & 6 deletions clang/include/clang/Sema/Sema.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ class MangleNumberingContext;
typedef ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> ModuleIdPath;
class ModuleLoader;
class MultiLevelTemplateArgumentList;
struct CachedNormalizedConstraint;
struct NormalizedConstraint;
class ObjCInterfaceDecl;
class ObjCMethodDecl;
Expand Down Expand Up @@ -11303,7 +11304,9 @@ class Sema final : public SemaBase {
/// parameter (e.g. T in template <template \<typename> class T> class array)
/// has been parsed. S is the current scope.
NamedDecl *ActOnTemplateTemplateParameter(
Scope *S, SourceLocation TmpLoc, TemplateNameKind Kind,
Scope *S, SourceLocation TmpLoc,
TemplateNameKind Kind,
bool TypenameKeyword,
TemplateParameterList *Params, SourceLocation EllipsisLoc,
IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth,
unsigned Position, SourceLocation EqualLoc,
Expand Down Expand Up @@ -12135,7 +12138,7 @@ class Sema final : public SemaBase {

void CheckConceptRedefinition(ConceptDecl *NewDecl, LookupResult &Previous,
bool &AddToScope);
bool CheckConceptUseInDefinition(ConceptDecl *Concept, SourceLocation Loc);
bool CheckConceptUseInDefinition(NamedDecl *Concept, SourceLocation Loc);

TypeResult ActOnDependentTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
const CXXScopeSpec &SS,
Expand Down Expand Up @@ -14575,9 +14578,7 @@ class Sema final : public SemaBase {
bool First = true);

const NormalizedConstraint *getNormalizedAssociatedConstraints(NamedDecl *ConstrainedDecl,
ArrayRef<const Expr *> AssociatedConstraints,
std::optional<ArrayRef<TemplateArgument> > TemplateArgs = std::nullopt, bool TopLevel = false,
AtomicConstraint::FoldKind FK = AtomicConstraint::FoldKind::FoldNone);
ArrayRef<const Expr *> AssociatedConstraints);

/// \brief Check whether the given declaration's associated constraints are
/// at least as constrained than another declaration's according to the
Expand Down Expand Up @@ -14608,7 +14609,7 @@ class Sema final : public SemaBase {
/// constrained declarations). If an error occurred while normalizing the
/// associated constraints of the template or concept, nullptr will be cached
/// here.
llvm::FoldingSet<CachedNormalizedConstraint> NormalizationCache;
llvm::DenseMap<NamedDecl *, NormalizedConstraint *> NormalizationCache;

llvm::ContextualFoldingSet<ConstraintSatisfaction, const ASTContext &>
SatisfactionCache;
Expand Down
37 changes: 4 additions & 33 deletions clang/include/clang/Sema/SemaConcept.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,6 @@ struct alignas(ConstraintAlignment) AtomicConstraint {

for (unsigned I = 0, S = ParameterMapping->size(); I < S; ++I) {
llvm::FoldingSetNodeID IDA, IDB;
if ((*ParameterMapping)[I]
.getArgument()
.isConceptOrConceptTemplateParameter())
continue;
C.getCanonicalTemplateArgument((*ParameterMapping)[I].getArgument())
.Profile(IDA, C);
C.getCanonicalTemplateArgument((*Other.ParameterMapping)[I].getArgument())
Expand All @@ -77,9 +73,6 @@ struct alignas(ConstraintAlignment) AtomicConstraint {
if (ConstraintExpr != Other.ConstraintExpr)
return false;

if (!isCompatibleFold(Other))
return false;

// Check that the parameter lists are identical
return hasMatchingParameterMapping(C, Other);
}
Expand Down Expand Up @@ -162,39 +155,17 @@ struct NormalizedConstraint {
return Constraint.get<AtomicConstraint *>();
}

void dump() {
if (isAtomic()) {
llvm::outs() << getAtomicConstraint()->ConstraintExpr;
return;
}
getLHS().dump();
llvm::outs() << "\n";
llvm::outs() << (getCompoundKind() ==
CompoundConstraintKind::CCK_Conjunction
? "&&"
: "||")
<< "\n";
getRHS().dump();
llvm::outs() << "\n";
}

FoldExpandedConstraint *getFoldExpandedConstraint() const {
assert(isFoldExpanded() &&
"getFoldExpandedConstraint called on non-fold-expanded constraint.");
return Constraint.get<FoldExpandedConstraint *>();
}

private:
static std::optional<NormalizedConstraint> fromConstraintExprs(
Sema &S, NamedDecl *D, ArrayRef<const Expr *> E,
std::optional<ArrayRef<TemplateArgument>> TemplateArgs,
AtomicConstraint::FoldKind FK = AtomicConstraint::FoldKind::FoldNone);
static std::optional<NormalizedConstraint> fromConstraintExpr(Sema &S, NamedDecl *D, const Expr *E,
std::optional<ArrayRef<TemplateArgument>> TemplateArgs = std::nullopt,
AtomicConstraint::FoldKind FK = AtomicConstraint::FoldKind::FoldNone);

protected:
NormalizedConstraint() = default;
static std::optional<NormalizedConstraint>
fromConstraintExprs(Sema &S, NamedDecl *D, ArrayRef<const Expr *> E);
static std::optional<NormalizedConstraint>
fromConstraintExpr(Sema &S, NamedDecl *D, const Expr *E);
};

struct alignas(ConstraintAlignment) NormalizedConstraintPair {
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/AST/ASTImporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6040,7 +6040,7 @@ ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
ToD, D, Importer.getToContext(),
Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
D->getDepth(), D->getPosition(), D->isParameterPack(),
(*NameOrErr).getAsIdentifierInfo(), D->kind(), *TemplateParamsOrErr))
(*NameOrErr).getAsIdentifierInfo(), D->kind(), D->wasDeclaredWithTypename(), *TemplateParamsOrErr))
return ToD;

if (Error Err = importTemplateParameterDefaultArgument(D, ToD))
Expand Down
27 changes: 17 additions & 10 deletions clang/lib/AST/DeclTemplate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ TemplateParameterList::TemplateParameterList(const ASTContext& C,
}
}

}

bool TemplateParameterList::containsUnexpandedParameterPack() const {
if (ContainsUnexpandedParameterPack)
return true;
Expand Down Expand Up @@ -840,7 +842,8 @@ void TemplateTemplateParmDecl::anchor() {}

TemplateTemplateParmDecl::TemplateTemplateParmDecl(
DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
IdentifierInfo *Id, TemplateNameKind Kind, TemplateParameterList *Params,
IdentifierInfo *Id, TemplateNameKind Kind, bool Typename,
TemplateParameterList *Params,
ArrayRef<TemplateParameterList *> Expansions)
: TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
TemplateParmPosition(D, P), Typename(Typename), ParameterPack(true),
Expand All @@ -853,28 +856,29 @@ TemplateTemplateParmDecl::TemplateTemplateParmDecl(

TemplateTemplateParmDecl *TemplateTemplateParmDecl::Create(
const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D,
unsigned P, bool ParameterPack, IdentifierInfo *Id, bool Typename, TemplateNameKind Kind,
unsigned P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind Kind,
bool Typename,
TemplateParameterList *Params) {
return new (C, DC)
TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, Typename, Kind, Params);
TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, Kind, Typename, Params);
}

TemplateTemplateParmDecl *
TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
SourceLocation L, unsigned D, unsigned P,
IdentifierInfo *Id, bool Typename, TemplateNameKind Kind,
IdentifierInfo *Id, TemplateNameKind Kind, bool Typename,
TemplateParameterList *Params,
ArrayRef<TemplateParameterList *> Expansions) {
return new (C, DC,
additionalSizeToAlloc<TemplateParameterList *>(Expansions.size()))
TemplateTemplateParmDecl(DC, L, D, P, Id, Typename, Kind, Params, Expansions);
TemplateTemplateParmDecl(DC, L, D, P, Id, Kind, Typename, Params, Expansions);
}

TemplateTemplateParmDecl *
TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
return new (C, ID)
TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, false, nullptr,
false, TemplateNameKind::TNK_Type_template, nullptr);
TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr,
TemplateNameKind::TNK_Type_template, false, nullptr, std::nullopt);
}

TemplateTemplateParmDecl *
Expand All @@ -883,7 +887,7 @@ TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID,
auto *TTP =
new (C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions))
TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr,
false, TemplateNameKind::TNK_Type_template, nullptr,
TemplateNameKind::TNK_Type_template, false, nullptr,
std::nullopt);
TTP->NumExpandedParams = NumExpansions;
return TTP;
Expand Down Expand Up @@ -1582,7 +1586,8 @@ createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) {
auto *TemplateTemplateParm = TemplateTemplateParmDecl::Create(
C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/0,
/*ParameterPack=*/false, /*Id=*/nullptr,
/*Typename=*/false, TemplateNameKind::TNK_Type_template, TPL);
TemplateNameKind::TNK_Type_template,
/*Typename=*/false, TPL);
TemplateTemplateParm->setImplicit(true);

// typename T
Expand Down Expand Up @@ -1644,6 +1649,7 @@ static TemplateParameterList *createBuiltinCommonTypeList(const ASTContext &C,
auto *BaseTemplate = TemplateTemplateParmDecl::Create(
C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/0,
/*ParameterPack=*/false, /*Id=*/nullptr,
TemplateNameKind::TNK_Type_template,
/*Typename=*/false, BaseTemplateList);

// class TypeMember
Expand All @@ -1661,6 +1667,7 @@ static TemplateParameterList *createBuiltinCommonTypeList(const ASTContext &C,
auto *HasTypeMember = TemplateTemplateParmDecl::Create(
C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/1,
/*ParameterPack=*/false, /*Id=*/nullptr,
TemplateNameKind::TNK_Type_template,
/*Typename=*/false, HasTypeMemberList);

// class HasNoTypeMember
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Sema/SemaChecking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "clang/AST/RecordLayout.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/TemplateBase.h"
#include "clang/AST/TemplateName.h"
#include "clang/AST/Type.h"
#include "clang/AST/TypeLoc.h"
#include "clang/AST/UnresolvedSet.h"
Expand Down Expand Up @@ -3389,7 +3390,7 @@ void Sema::checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto,
}

void Sema::CheckConstrainedAuto(const AutoType *AutoT, SourceLocation Loc) {
if (ConceptDecl *Decl = AutoT->getTypeConstraintConcept()) {
if (TemplateDecl *Decl = AutoT->getTypeConstraintConcept()) {
DiagnoseUseOfDecl(Decl, Loc);
}
}
Expand Down
Loading

0 comments on commit b93e741

Please sign in to comment.