Skip to content

Commit cfd9d69

Browse files
Simpler approach
1 parent d343d5e commit cfd9d69

File tree

4 files changed

+38
-42
lines changed

4 files changed

+38
-42
lines changed

clang/include/clang/AST/DeclTemplate.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,8 +1365,6 @@ class NonTypeTemplateParmDecl final
13651365
DefaultArgStorage<NonTypeTemplateParmDecl, TemplateArgumentLoc *>;
13661366
DefArgStorage DefaultArgument;
13671367

1368-
bool PlaceholderTypeConstraintInitialized = false;
1369-
13701368
// FIXME: Collapse this into TemplateParamPosition; or, just move depth/index
13711369
// down here to save memory.
13721370

@@ -1535,11 +1533,13 @@ class NonTypeTemplateParmDecl final
15351533
/// Return the constraint introduced by the placeholder type of this non-type
15361534
/// template parameter (if any).
15371535
Expr *getPlaceholderTypeConstraint() const {
1538-
return PlaceholderTypeConstraintInitialized ? *getTrailingObjects<Expr *>()
1539-
: nullptr;
1536+
return hasPlaceholderTypeConstraint() ? *getTrailingObjects<Expr *>() :
1537+
nullptr;
15401538
}
15411539

1542-
void setPlaceholderTypeConstraint(Expr *E);
1540+
void setPlaceholderTypeConstraint(Expr *E) {
1541+
*getTrailingObjects<Expr *>() = E;
1542+
}
15431543

15441544
/// Determine whether this non-type template parameter's type has a
15451545
/// placeholder with a type-constraint.

clang/lib/AST/DeclTemplate.cpp

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -786,12 +786,16 @@ NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create(
786786
QualType T, bool ParameterPack, TypeSourceInfo *TInfo) {
787787
AutoType *AT =
788788
C.getLangOpts().CPlusPlus20 ? T->getContainedAutoType() : nullptr;
789-
return new (C, DC,
790-
additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>,
791-
Expr *>(0,
792-
AT && AT->isConstrained() ? 1 : 0))
793-
NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, ParameterPack,
794-
TInfo);
789+
bool const HasConstraint = AT && AT->isConstrained();
790+
auto *NTTP =
791+
new (C, DC,
792+
additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>, Expr *>(
793+
0, HasConstraint ? 1 : 0))
794+
NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T,
795+
ParameterPack, TInfo);
796+
if (HasConstraint)
797+
NTTP->setPlaceholderTypeConstraint(nullptr);
798+
return NTTP;
795799
}
796800

797801
NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create(
@@ -800,23 +804,30 @@ NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create(
800804
QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes,
801805
ArrayRef<TypeSourceInfo *> ExpandedTInfos) {
802806
AutoType *AT = TInfo->getType()->getContainedAutoType();
803-
return new (C, DC,
804-
additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>,
805-
Expr *>(
806-
ExpandedTypes.size(), AT && AT->isConstrained() ? 1 : 0))
807-
NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, TInfo,
808-
ExpandedTypes, ExpandedTInfos);
807+
bool const HasConstraint = AT && AT->isConstrained();
808+
auto *NTTP =
809+
new (C, DC,
810+
additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>, Expr *>(
811+
ExpandedTypes.size(), HasConstraint ? 1 : 0))
812+
NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, TInfo,
813+
ExpandedTypes, ExpandedTInfos);
814+
if (HasConstraint)
815+
NTTP->setPlaceholderTypeConstraint(nullptr);
816+
return NTTP;
809817
}
810818

811819
NonTypeTemplateParmDecl *
812820
NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID,
813821
bool HasTypeConstraint) {
814-
return new (C, ID, additionalSizeToAlloc<std::pair<QualType,
815-
TypeSourceInfo *>,
816-
Expr *>(0,
817-
HasTypeConstraint ? 1 : 0))
822+
auto *NTTP =
823+
new (C, ID,
824+
additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>, Expr *>(
825+
0, HasTypeConstraint ? 1 : 0))
818826
NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(),
819827
0, 0, nullptr, QualType(), false, nullptr);
828+
if (HasTypeConstraint)
829+
NTTP->setPlaceholderTypeConstraint(nullptr);
830+
return NTTP;
820831
}
821832

822833
NonTypeTemplateParmDecl *
@@ -830,6 +841,8 @@ NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID,
830841
NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(),
831842
0, 0, nullptr, QualType(), nullptr, {}, {});
832843
NTTP->NumExpandedTypes = NumExpandedTypes;
844+
if (HasTypeConstraint)
845+
NTTP->setPlaceholderTypeConstraint(nullptr);
833846
return NTTP;
834847
}
835848

@@ -853,16 +866,6 @@ void NonTypeTemplateParmDecl::setDefaultArgument(
853866
DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg));
854867
}
855868

856-
void NonTypeTemplateParmDecl::setPlaceholderTypeConstraint(Expr *E) {
857-
assert(hasPlaceholderTypeConstraint() &&
858-
"setPlaceholderTypeConstraint called on a NonTypeTemplateParmDecl "
859-
"without constraint");
860-
assert(!PlaceholderTypeConstraintInitialized && "PlaceholderTypeConstraint "
861-
"was already initialized!");
862-
*getTrailingObjects<Expr *>() = E;
863-
PlaceholderTypeConstraintInitialized = true;
864-
}
865-
866869
//===----------------------------------------------------------------------===//
867870
// TemplateTemplateParmDecl Method Implementations
868871
//===----------------------------------------------------------------------===//

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2713,10 +2713,8 @@ void ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
27132713
// TemplateParmPosition.
27142714
D->setDepth(Record.readInt());
27152715
D->setPosition(Record.readInt());
2716-
if (D->hasPlaceholderTypeConstraint()) {
2717-
if (Record.readBool()) // PlaceholderTypeConstraintInitialized
2718-
D->setPlaceholderTypeConstraint(Record.readExpr());
2719-
}
2716+
if (D->hasPlaceholderTypeConstraint())
2717+
D->setPlaceholderTypeConstraint(Record.readExpr());
27202718
if (D->isExpandedParameterPack()) {
27212719
auto TypesAndInfos =
27222720
D->getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();

clang/lib/Serialization/ASTWriterDecl.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2020,13 +2020,8 @@ void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
20202020
Record.push_back(D->getDepth());
20212021
Record.push_back(D->getPosition());
20222022

2023-
if (D->hasPlaceholderTypeConstraint()) {
2024-
Expr *TypeConstraint = D->getPlaceholderTypeConstraint();
2025-
Record.push_back(/*PlaceholderTypeConstraintInitialized=*/TypeConstraint !=
2026-
nullptr);
2027-
if (TypeConstraint)
2028-
Record.AddStmt(TypeConstraint);
2029-
}
2023+
if (D->hasPlaceholderTypeConstraint())
2024+
Record.AddStmt(D->getPlaceholderTypeConstraint());
20302025

20312026
if (D->isExpandedParameterPack()) {
20322027
for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {

0 commit comments

Comments
 (0)