@@ -985,36 +985,40 @@ ClassTemplateSpecializationDecl::getSpecializedTemplate() const {
985
985
986
986
SourceRange
987
987
ClassTemplateSpecializationDecl::getSourceRange () const {
988
- if (getSpecializationKind () == TSK_ExplicitInstantiationDeclaration) {
989
- return SourceRange (getExternKeywordLoc (),
990
- getTemplateArgsAsWritten ()->getRAngleLoc ());
991
- } else if (getSpecializationKind () == TSK_ExplicitInstantiationDefinition) {
992
- return SourceRange (getTemplateKeywordLoc (),
993
- getTemplateArgsAsWritten ()->getRAngleLoc ());
994
- } else if (!isExplicitSpecialization ()) {
995
- // No explicit info available.
988
+ switch (getSpecializationKind ()) {
989
+ case TSK_Undeclared:
990
+ case TSK_ImplicitInstantiation: {
996
991
llvm::PointerUnion<ClassTemplateDecl *,
997
992
ClassTemplatePartialSpecializationDecl *>
998
- InstFrom = getInstantiatedFrom ();
999
- if (InstFrom.isNull ())
1000
- return getSpecializedTemplate ()->getSourceRange ();
1001
- if (const auto *CTD = InstFrom.dyn_cast <ClassTemplateDecl *>())
1002
- return CTD->getSourceRange ();
1003
- return InstFrom.get <ClassTemplatePartialSpecializationDecl *>()
1004
- ->getSourceRange ();
993
+ Pattern = getSpecializedTemplateOrPartial ();
994
+ assert (!Pattern.isNull () &&
995
+ " Class template specialization without pattern?" );
996
+ if (const auto *CTPSD =
997
+ Pattern.dyn_cast <ClassTemplatePartialSpecializationDecl *>())
998
+ return CTPSD->getSourceRange ();
999
+ return Pattern.get <ClassTemplateDecl *>()->getSourceRange ();
1000
+ }
1001
+ case TSK_ExplicitSpecialization: {
1002
+ SourceRange Range = CXXRecordDecl::getSourceRange ();
1003
+ if (const ASTTemplateArgumentListInfo *Args = getTemplateArgsAsWritten ();
1004
+ !isThisDeclarationADefinition () && Args)
1005
+ Range.setEnd (Args->getRAngleLoc ());
1006
+ return Range;
1007
+ }
1008
+ case TSK_ExplicitInstantiationDeclaration:
1009
+ case TSK_ExplicitInstantiationDefinition: {
1010
+ SourceRange Range = CXXRecordDecl::getSourceRange ();
1011
+ if (SourceLocation ExternKW = getExternKeywordLoc (); ExternKW.isValid ())
1012
+ Range.setBegin (ExternKW);
1013
+ else if (SourceLocation TemplateKW = getTemplateKeywordLoc ();
1014
+ TemplateKW.isValid ())
1015
+ Range.setBegin (TemplateKW);
1016
+ if (const ASTTemplateArgumentListInfo *Args = getTemplateArgsAsWritten ())
1017
+ Range.setEnd (Args->getRAngleLoc ());
1018
+ return Range;
1005
1019
}
1006
- SourceLocation Begin = TagDecl::getOuterLocStart ();
1007
- if (const auto *CTPSD =
1008
- dyn_cast<ClassTemplatePartialSpecializationDecl>(this )) {
1009
- if (const auto *InstFrom = CTPSD->getInstantiatedFromMember ())
1010
- return InstFrom->getSourceRange ();
1011
- else if (!getNumTemplateParameterLists ())
1012
- Begin = CTPSD->getTemplateParameters ()->getTemplateLoc ();
1013
1020
}
1014
- SourceLocation End = getBraceRange ().getEnd ();
1015
- if (End.isInvalid ())
1016
- End = getTemplateArgsAsWritten ()->getRAngleLoc ();
1017
- return SourceRange (Begin, End);
1021
+ llvm_unreachable (" unhandled template specialization kind" );
1018
1022
}
1019
1023
1020
1024
void ClassTemplateSpecializationDecl::setExternKeywordLoc (SourceLocation Loc) {
@@ -1147,6 +1151,18 @@ ClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
1147
1151
return Result;
1148
1152
}
1149
1153
1154
+ SourceRange ClassTemplatePartialSpecializationDecl::getSourceRange () const {
1155
+ if (const ClassTemplatePartialSpecializationDecl *MT =
1156
+ getInstantiatedFromMember ();
1157
+ MT && !isMemberSpecialization ())
1158
+ return MT->getSourceRange ();
1159
+ SourceRange Range = ClassTemplateSpecializationDecl::getSourceRange ();
1160
+ if (const TemplateParameterList *TPL = getTemplateParameters ();
1161
+ TPL && !getNumTemplateParameterLists ())
1162
+ Range.setBegin (TPL->getTemplateLoc ());
1163
+ return Range;
1164
+ }
1165
+
1150
1166
// ===----------------------------------------------------------------------===//
1151
1167
// FriendTemplateDecl Implementation
1152
1168
// ===----------------------------------------------------------------------===//
@@ -1380,19 +1396,45 @@ VarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const {
1380
1396
}
1381
1397
1382
1398
SourceRange VarTemplateSpecializationDecl::getSourceRange () const {
1383
- if (isExplicitSpecialization () && !hasInit ()) {
1384
- if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten ())
1385
- return SourceRange (getOuterLocStart (), Info->getRAngleLoc ());
1386
- } else if (getTemplateSpecializationKind () ==
1387
- TSK_ExplicitInstantiationDeclaration) {
1388
- if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten ())
1389
- return SourceRange (getExternKeywordLoc (), Info->getRAngleLoc ());
1390
- } else if (getTemplateSpecializationKind () ==
1391
- TSK_ExplicitInstantiationDefinition) {
1392
- if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten ())
1393
- return SourceRange (getTemplateKeywordLoc (), Info->getRAngleLoc ());
1399
+ switch (getSpecializationKind ()) {
1400
+ case TSK_Undeclared:
1401
+ case TSK_ImplicitInstantiation: {
1402
+ llvm::PointerUnion<VarTemplateDecl *,
1403
+ VarTemplatePartialSpecializationDecl *>
1404
+ Pattern = getSpecializedTemplateOrPartial ();
1405
+ assert (!Pattern.isNull () &&
1406
+ " Variable template specialization without pattern?" );
1407
+ if (const auto *VTPSD =
1408
+ Pattern.dyn_cast <VarTemplatePartialSpecializationDecl *>())
1409
+ return VTPSD->getSourceRange ();
1410
+ VarTemplateDecl *VTD = Pattern.get <VarTemplateDecl *>();
1411
+ if (hasInit ()) {
1412
+ if (VarTemplateDecl *Definition = VTD->getDefinition ())
1413
+ return Definition->getSourceRange ();
1414
+ }
1415
+ return VTD->getCanonicalDecl ()->getSourceRange ();
1416
+ }
1417
+ case TSK_ExplicitSpecialization: {
1418
+ SourceRange Range = VarDecl::getSourceRange ();
1419
+ if (const ASTTemplateArgumentListInfo *Args = getTemplateArgsAsWritten ();
1420
+ !hasInit () && Args)
1421
+ Range.setEnd (Args->getRAngleLoc ());
1422
+ return Range;
1423
+ }
1424
+ case TSK_ExplicitInstantiationDeclaration:
1425
+ case TSK_ExplicitInstantiationDefinition: {
1426
+ SourceRange Range = VarDecl::getSourceRange ();
1427
+ if (SourceLocation ExternKW = getExternKeywordLoc (); ExternKW.isValid ())
1428
+ Range.setBegin (ExternKW);
1429
+ else if (SourceLocation TemplateKW = getTemplateKeywordLoc ();
1430
+ TemplateKW.isValid ())
1431
+ Range.setBegin (TemplateKW);
1432
+ if (const ASTTemplateArgumentListInfo *Args = getTemplateArgsAsWritten ())
1433
+ Range.setEnd (Args->getRAngleLoc ());
1434
+ return Range;
1394
1435
}
1395
- return VarDecl::getSourceRange ();
1436
+ }
1437
+ llvm_unreachable (" unhandled template specialization kind" );
1396
1438
}
1397
1439
1398
1440
void VarTemplateSpecializationDecl::setExternKeywordLoc (SourceLocation Loc) {
@@ -1460,11 +1502,15 @@ VarTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
1460
1502
}
1461
1503
1462
1504
SourceRange VarTemplatePartialSpecializationDecl::getSourceRange () const {
1463
- if (isExplicitSpecialization () && !hasInit ()) {
1464
- if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten ())
1465
- return SourceRange (getOuterLocStart (), Info->getRAngleLoc ());
1466
- }
1467
- return VarDecl::getSourceRange ();
1505
+ if (const VarTemplatePartialSpecializationDecl *MT =
1506
+ getInstantiatedFromMember ();
1507
+ MT && !isMemberSpecialization ())
1508
+ return MT->getSourceRange ();
1509
+ SourceRange Range = VarTemplateSpecializationDecl::getSourceRange ();
1510
+ if (const TemplateParameterList *TPL = getTemplateParameters ();
1511
+ TPL && !getNumTemplateParameterLists ())
1512
+ Range.setBegin (TPL->getTemplateLoc ());
1513
+ return Range;
1468
1514
}
1469
1515
1470
1516
static TemplateParameterList *
0 commit comments