Skip to content

Commit 977ef6f

Browse files
committed
Revert "[Clang][AST] Track whether template template parameters used the 'typename' keyword (llvm#88139)"
This reverts commit 4e6d18f.
1 parent 99e26ef commit 977ef6f

File tree

13 files changed

+52
-75
lines changed

13 files changed

+52
-75
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,6 @@ Improvements to Clang's diagnostics
363363
Added the ``-Wtentative-definition-array`` warning group to cover this.
364364
Fixes #GH87766
365365

366-
- Clang now uses the correct type-parameter-key (``class`` or ``typename``) when printing
367-
template template parameter declarations.
368-
369366
Improvements to Clang's time-trace
370367
----------------------------------
371368

@@ -543,7 +540,6 @@ Bug Fixes to C++ Support
543540
Bug Fixes to AST Handling
544541
^^^^^^^^^^^^^^^^^^^^^^^^^
545542
- Clang now properly preserves ``FoundDecls`` within a ``ConceptReference``. (#GH82628)
546-
- The presence of the ``typename`` keyword is now stored in ``TemplateTemplateParmDecl``.
547543

548544
Miscellaneous Bug Fixes
549545
^^^^^^^^^^^^^^^^^^^^^^^

clang/include/clang/AST/DeclTemplate.h

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,36 +1581,26 @@ class TemplateTemplateParmDecl final
15811581
DefaultArgStorage<TemplateTemplateParmDecl, TemplateArgumentLoc *>;
15821582
DefArgStorage DefaultArgument;
15831583

1584-
/// Whether this template template parameter was declaration with
1585-
/// the 'typename' keyword.
1586-
///
1587-
/// If false, it was declared with the 'class' keyword.
1588-
LLVM_PREFERRED_TYPE(bool)
1589-
unsigned Typename : 1;
1590-
15911584
/// Whether this parameter is a parameter pack.
1592-
LLVM_PREFERRED_TYPE(bool)
1593-
unsigned ParameterPack : 1;
1585+
bool ParameterPack;
15941586

15951587
/// Whether this template template parameter is an "expanded"
15961588
/// parameter pack, meaning that it is a pack expansion and we
15971589
/// already know the set of template parameters that expansion expands to.
1598-
LLVM_PREFERRED_TYPE(bool)
1599-
unsigned ExpandedParameterPack : 1;
1590+
bool ExpandedParameterPack = false;
16001591

16011592
/// The number of parameters in an expanded parameter pack.
16021593
unsigned NumExpandedParams = 0;
16031594

1604-
TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L, unsigned D,
1605-
unsigned P, bool ParameterPack, IdentifierInfo *Id,
1606-
bool Typename, TemplateParameterList *Params)
1595+
TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L,
1596+
unsigned D, unsigned P, bool ParameterPack,
1597+
IdentifierInfo *Id, TemplateParameterList *Params)
16071598
: TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
1608-
TemplateParmPosition(D, P), Typename(Typename),
1609-
ParameterPack(ParameterPack), ExpandedParameterPack(false) {}
1599+
TemplateParmPosition(D, P), ParameterPack(ParameterPack) {}
16101600

1611-
TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L, unsigned D,
1612-
unsigned P, IdentifierInfo *Id, bool Typename,
1613-
TemplateParameterList *Params,
1601+
TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L,
1602+
unsigned D, unsigned P,
1603+
IdentifierInfo *Id, TemplateParameterList *Params,
16141604
ArrayRef<TemplateParameterList *> Expansions);
16151605

16161606
void anchor() override;
@@ -1623,13 +1613,14 @@ class TemplateTemplateParmDecl final
16231613
static TemplateTemplateParmDecl *Create(const ASTContext &C, DeclContext *DC,
16241614
SourceLocation L, unsigned D,
16251615
unsigned P, bool ParameterPack,
1626-
IdentifierInfo *Id, bool Typename,
1616+
IdentifierInfo *Id,
16271617
TemplateParameterList *Params);
1628-
static TemplateTemplateParmDecl *
1629-
Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D,
1630-
unsigned P, IdentifierInfo *Id, bool Typename,
1631-
TemplateParameterList *Params,
1632-
ArrayRef<TemplateParameterList *> Expansions);
1618+
static TemplateTemplateParmDecl *Create(const ASTContext &C, DeclContext *DC,
1619+
SourceLocation L, unsigned D,
1620+
unsigned P,
1621+
IdentifierInfo *Id,
1622+
TemplateParameterList *Params,
1623+
ArrayRef<TemplateParameterList *> Expansions);
16331624

16341625
static TemplateTemplateParmDecl *CreateDeserialized(ASTContext &C,
16351626
unsigned ID);
@@ -1643,14 +1634,6 @@ class TemplateTemplateParmDecl final
16431634
using TemplateParmPosition::setPosition;
16441635
using TemplateParmPosition::getIndex;
16451636

1646-
/// Whether this template template parameter was declared with
1647-
/// the 'typename' keyword.
1648-
bool wasDeclaredWithTypename() const { return Typename; }
1649-
1650-
/// Set whether this template template parameter was declared with
1651-
/// the 'typename' or 'class' keyword.
1652-
void setDeclaredWithTypename(bool withTypename) { Typename = withTypename; }
1653-
16541637
/// Whether this template template parameter is a template
16551638
/// parameter pack.
16561639
///

clang/include/clang/Sema/Sema.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9111,7 +9111,7 @@ class Sema final : public SemaBase {
91119111
Expr *DefaultArg);
91129112
NamedDecl *ActOnTemplateTemplateParameter(
91139113
Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params,
9114-
bool Typename, SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
9114+
SourceLocation EllipsisLoc, IdentifierInfo *ParamName,
91159115
SourceLocation ParamNameLoc, unsigned Depth, unsigned Position,
91169116
SourceLocation EqualLoc, ParsedTemplateArgument DefaultArg);
91179117

clang/lib/AST/ASTContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,7 @@ ASTContext::getCanonicalTemplateTemplateParmDecl(
799799

800800
TemplateTemplateParmDecl *CanonTTP = TemplateTemplateParmDecl::Create(
801801
*this, getTranslationUnitDecl(), SourceLocation(), TTP->getDepth(),
802-
TTP->getPosition(), TTP->isParameterPack(), nullptr, /*Typename=*/false,
802+
TTP->getPosition(), TTP->isParameterPack(), nullptr,
803803
TemplateParameterList::Create(*this, SourceLocation(), SourceLocation(),
804804
CanonParams, SourceLocation(),
805805
/*RequiresClause=*/nullptr));

clang/lib/AST/ASTImporter.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5983,8 +5983,7 @@ ASTNodeImporter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
59835983
ToD, D, Importer.getToContext(),
59845984
Importer.getToContext().getTranslationUnitDecl(), *LocationOrErr,
59855985
D->getDepth(), D->getPosition(), D->isParameterPack(),
5986-
(*NameOrErr).getAsIdentifierInfo(), D->wasDeclaredWithTypename(),
5987-
*TemplateParamsOrErr))
5986+
(*NameOrErr).getAsIdentifierInfo(), *TemplateParamsOrErr))
59885987
return ToD;
59895988

59905989
if (D->hasDefaultArgument()) {

clang/lib/AST/DeclPrinter.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,10 +1223,7 @@ void DeclPrinter::VisitTemplateDecl(const TemplateDecl *D) {
12231223

12241224
if (const TemplateTemplateParmDecl *TTP =
12251225
dyn_cast<TemplateTemplateParmDecl>(D)) {
1226-
if (TTP->wasDeclaredWithTypename())
1227-
Out << "typename";
1228-
else
1229-
Out << "class";
1226+
Out << "class";
12301227

12311228
if (TTP->isParameterPack())
12321229
Out << " ...";

clang/lib/AST/DeclTemplate.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -805,10 +805,10 @@ void TemplateTemplateParmDecl::anchor() {}
805805

806806
TemplateTemplateParmDecl::TemplateTemplateParmDecl(
807807
DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
808-
IdentifierInfo *Id, bool Typename, TemplateParameterList *Params,
808+
IdentifierInfo *Id, TemplateParameterList *Params,
809809
ArrayRef<TemplateParameterList *> Expansions)
810810
: TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
811-
TemplateParmPosition(D, P), Typename(Typename), ParameterPack(true),
811+
TemplateParmPosition(D, P), ParameterPack(true),
812812
ExpandedParameterPack(true), NumExpandedParams(Expansions.size()) {
813813
if (!Expansions.empty())
814814
std::uninitialized_copy(Expansions.begin(), Expansions.end(),
@@ -819,26 +819,26 @@ TemplateTemplateParmDecl *
819819
TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
820820
SourceLocation L, unsigned D, unsigned P,
821821
bool ParameterPack, IdentifierInfo *Id,
822-
bool Typename, TemplateParameterList *Params) {
822+
TemplateParameterList *Params) {
823823
return new (C, DC) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
824-
Typename, Params);
824+
Params);
825825
}
826826

827827
TemplateTemplateParmDecl *
828828
TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
829829
SourceLocation L, unsigned D, unsigned P,
830-
IdentifierInfo *Id, bool Typename,
830+
IdentifierInfo *Id,
831831
TemplateParameterList *Params,
832832
ArrayRef<TemplateParameterList *> Expansions) {
833833
return new (C, DC,
834834
additionalSizeToAlloc<TemplateParameterList *>(Expansions.size()))
835-
TemplateTemplateParmDecl(DC, L, D, P, Id, Typename, Params, Expansions);
835+
TemplateTemplateParmDecl(DC, L, D, P, Id, Params, Expansions);
836836
}
837837

838838
TemplateTemplateParmDecl *
839839
TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
840840
return new (C, ID) TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0,
841-
false, nullptr, false, nullptr);
841+
false, nullptr, nullptr);
842842
}
843843

844844
TemplateTemplateParmDecl *
@@ -847,7 +847,7 @@ TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
847847
auto *TTP =
848848
new (C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions))
849849
TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr,
850-
false, nullptr, std::nullopt);
850+
nullptr, std::nullopt);
851851
TTP->NumExpandedParams = NumExpansions;
852852
return TTP;
853853
}
@@ -1469,7 +1469,7 @@ createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) {
14691469
// template <typename T, ...Ints> class IntSeq
14701470
auto *TemplateTemplateParm = TemplateTemplateParmDecl::Create(
14711471
C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/0,
1472-
/*ParameterPack=*/false, /*Id=*/nullptr, /*Typename=*/false, TPL);
1472+
/*ParameterPack=*/false, /*Id=*/nullptr, TPL);
14731473
TemplateTemplateParm->setImplicit(true);
14741474

14751475
// typename T

clang/lib/Parse/ParseTemplate.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -805,12 +805,10 @@ NamedDecl *Parser::ParseTemplateTemplateParameter(unsigned Depth,
805805
// identifier, comma, or greater. Provide a fixit if the identifier, comma,
806806
// or greater appear immediately or after 'struct'. In the latter case,
807807
// replace the keyword with 'class'.
808-
bool TypenameKeyword = false;
809808
if (!TryConsumeToken(tok::kw_class)) {
810809
bool Replace = Tok.isOneOf(tok::kw_typename, tok::kw_struct);
811810
const Token &Next = Tok.is(tok::kw_struct) ? NextToken() : Tok;
812811
if (Tok.is(tok::kw_typename)) {
813-
TypenameKeyword = true;
814812
Diag(Tok.getLocation(),
815813
getLangOpts().CPlusPlus17
816814
? diag::warn_cxx14_compat_template_template_param_typename
@@ -880,9 +878,10 @@ NamedDecl *Parser::ParseTemplateTemplateParameter(unsigned Depth,
880878
}
881879
}
882880

883-
return Actions.ActOnTemplateTemplateParameter(
884-
getCurScope(), TemplateLoc, ParamList, TypenameKeyword, EllipsisLoc,
885-
ParamName, NameLoc, Depth, Position, EqualLoc, DefaultArg);
881+
return Actions.ActOnTemplateTemplateParameter(getCurScope(), TemplateLoc,
882+
ParamList, EllipsisLoc,
883+
ParamName, NameLoc, Depth,
884+
Position, EqualLoc, DefaultArg);
886885
}
887886

888887
/// ParseNonTypeTemplateParameter - Handle the parsing of non-type

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,20 +1632,26 @@ NamedDecl *Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D,
16321632
/// ActOnTemplateTemplateParameter - Called when a C++ template template
16331633
/// parameter (e.g. T in template <template \<typename> class T> class array)
16341634
/// has been parsed. S is the current scope.
1635-
NamedDecl *Sema::ActOnTemplateTemplateParameter(
1636-
Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params,
1637-
bool Typename, SourceLocation EllipsisLoc, IdentifierInfo *Name,
1638-
SourceLocation NameLoc, unsigned Depth, unsigned Position,
1639-
SourceLocation EqualLoc, ParsedTemplateArgument Default) {
1635+
NamedDecl *Sema::ActOnTemplateTemplateParameter(Scope* S,
1636+
SourceLocation TmpLoc,
1637+
TemplateParameterList *Params,
1638+
SourceLocation EllipsisLoc,
1639+
IdentifierInfo *Name,
1640+
SourceLocation NameLoc,
1641+
unsigned Depth,
1642+
unsigned Position,
1643+
SourceLocation EqualLoc,
1644+
ParsedTemplateArgument Default) {
16401645
assert(S->isTemplateParamScope() &&
16411646
"Template template parameter not in template parameter scope!");
16421647

16431648
// Construct the parameter object.
16441649
bool IsParameterPack = EllipsisLoc.isValid();
1645-
TemplateTemplateParmDecl *Param = TemplateTemplateParmDecl::Create(
1646-
Context, Context.getTranslationUnitDecl(),
1647-
NameLoc.isInvalid() ? TmpLoc : NameLoc, Depth, Position, IsParameterPack,
1648-
Name, Typename, Params);
1650+
TemplateTemplateParmDecl *Param =
1651+
TemplateTemplateParmDecl::Create(Context, Context.getTranslationUnitDecl(),
1652+
NameLoc.isInvalid()? TmpLoc : NameLoc,
1653+
Depth, Position, IsParameterPack,
1654+
Name, Params);
16491655
Param->setAccess(AS_public);
16501656

16511657
if (Param->isParameterPack())

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3388,14 +3388,12 @@ TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
33883388
Param = TemplateTemplateParmDecl::Create(
33893389
SemaRef.Context, Owner, D->getLocation(),
33903390
D->getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3391-
D->getPosition(), D->getIdentifier(), D->wasDeclaredWithTypename(),
3392-
InstParams, ExpandedParams);
3391+
D->getPosition(), D->getIdentifier(), InstParams, ExpandedParams);
33933392
else
33943393
Param = TemplateTemplateParmDecl::Create(
33953394
SemaRef.Context, Owner, D->getLocation(),
33963395
D->getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3397-
D->getPosition(), D->isParameterPack(), D->getIdentifier(),
3398-
D->wasDeclaredWithTypename(), InstParams);
3396+
D->getPosition(), D->isParameterPack(), D->getIdentifier(), InstParams);
33993397
if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
34003398
NestedNameSpecifierLoc QualifierLoc =
34013399
D->getDefaultArgument().getTemplateQualifierLoc();

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2735,7 +2735,6 @@ void ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
27352735

27362736
void ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
27372737
VisitTemplateDecl(D);
2738-
D->setDeclaredWithTypename(Record.readBool());
27392738
// TemplateParmPosition.
27402739
D->setDepth(Record.readInt());
27412740
D->setPosition(Record.readInt());

clang/lib/Serialization/ASTWriterDecl.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1947,7 +1947,6 @@ void ASTDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
19471947
Record.push_back(D->getNumExpansionTemplateParameters());
19481948

19491949
VisitTemplateDecl(D);
1950-
Record.push_back(D->wasDeclaredWithTypename());
19511950
// TemplateParmPosition.
19521951
Record.push_back(D->getDepth());
19531952
Record.push_back(D->getPosition());

clang/unittests/AST/DeclPrinterTest.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,8 @@ TEST(DeclPrinter, TestTemplateTemplateParameterWrittenWithTypename) {
12201220
ASSERT_TRUE(PrintedDeclCXX17Matches(
12211221
"template <template <typename> typename Z> void A();",
12221222
functionTemplateDecl(hasName("A")).bind("id"),
1223-
"template <template <typename> typename Z> void A()"));
1223+
"template <template <typename> class Z> void A()"));
1224+
// WRONG: We should use typename if the parameter was written with it.
12241225
}
12251226

12261227
TEST(DeclPrinter, TestTemplateArgumentList1) {

0 commit comments

Comments
 (0)