[AST] Add RParen loc for decltype AutoTypeloc.
Differential Revision: https://reviews.llvm.org/D116919
This commit is contained in:
@@ -391,6 +391,8 @@ TEST(SelectionTest, CommonAncestor) {
|
||||
)cpp",
|
||||
"DeclRefExpr"},
|
||||
{"[[decltype^(1)]] b;", "DecltypeTypeLoc"}, // Not the VarDecl.
|
||||
// decltype(auto) is an AutoTypeLoc!
|
||||
{"[[de^cltype(a^uto)]] a = 1;", "AutoTypeLoc"},
|
||||
|
||||
// Objective-C nullability attributes.
|
||||
{
|
||||
|
||||
@@ -2081,6 +2081,9 @@ struct AutoTypeLocInfo : TypeSpecLocInfo {
|
||||
NamedDecl *FoundDecl;
|
||||
SourceLocation LAngleLoc;
|
||||
SourceLocation RAngleLoc;
|
||||
|
||||
// For decltype(auto).
|
||||
SourceLocation RParenLoc;
|
||||
};
|
||||
|
||||
class AutoTypeLoc
|
||||
@@ -2093,6 +2096,10 @@ public:
|
||||
return getTypePtr()->getKeyword();
|
||||
}
|
||||
|
||||
bool isDecltypeAuto() const { return getTypePtr()->isDecltypeAuto(); }
|
||||
SourceLocation getRParenLoc() const { return getLocalData()->RParenLoc; }
|
||||
void setRParenLoc(SourceLocation Loc) { getLocalData()->RParenLoc = Loc; }
|
||||
|
||||
bool isConstrained() const {
|
||||
return getTypePtr()->isConstrained();
|
||||
}
|
||||
@@ -2173,16 +2180,13 @@ public:
|
||||
}
|
||||
|
||||
SourceRange getLocalSourceRange() const {
|
||||
return{
|
||||
isConstrained()
|
||||
? (getNestedNameSpecifierLoc()
|
||||
? getNestedNameSpecifierLoc().getBeginLoc()
|
||||
: (getTemplateKWLoc().isValid()
|
||||
? getTemplateKWLoc()
|
||||
: getConceptNameLoc()))
|
||||
: getNameLoc(),
|
||||
getNameLoc()
|
||||
};
|
||||
return {isConstrained()
|
||||
? (getNestedNameSpecifierLoc()
|
||||
? getNestedNameSpecifierLoc().getBeginLoc()
|
||||
: (getTemplateKWLoc().isValid() ? getTemplateKWLoc()
|
||||
: getConceptNameLoc()))
|
||||
: getNameLoc(),
|
||||
isDecltypeAuto() ? getRParenLoc() : getNameLoc()};
|
||||
}
|
||||
|
||||
void copy(AutoTypeLoc Loc) {
|
||||
|
||||
@@ -622,6 +622,7 @@ void AutoTypeLoc::initializeLocal(ASTContext &Context, SourceLocation Loc) {
|
||||
setFoundDecl(nullptr);
|
||||
setRAngleLoc(Loc);
|
||||
setLAngleLoc(Loc);
|
||||
setRParenLoc(Loc);
|
||||
TemplateSpecializationTypeLoc::initializeArgLocs(Context, getNumArgs(),
|
||||
getTypePtr()->getArgs(),
|
||||
getArgInfos(), Loc);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "clang/AST/TypeLoc.h"
|
||||
#include "clang/AST/TypeLocVisitor.h"
|
||||
#include "clang/Basic/PartialDiagnostic.h"
|
||||
#include "clang/Basic/Specifiers.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
#include "clang/Sema/DeclSpec.h"
|
||||
@@ -6041,6 +6042,8 @@ namespace {
|
||||
DS.getTypeSpecType() == TST_auto_type ||
|
||||
DS.getTypeSpecType() == TST_unspecified);
|
||||
TL.setNameLoc(DS.getTypeSpecTypeLoc());
|
||||
if (DS.getTypeSpecType() == TST_decltype_auto)
|
||||
TL.setRParenLoc(DS.getTypeofParensRange().getEnd());
|
||||
if (!DS.isConstrainedAuto())
|
||||
return;
|
||||
TemplateIdAnnotation *TemplateId = DS.getRepAsTemplateId();
|
||||
|
||||
@@ -6652,6 +6652,8 @@ void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) {
|
||||
TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo(
|
||||
TL.getTypePtr()->getArg(i).getKind()));
|
||||
}
|
||||
if (Reader.readBool())
|
||||
TL.setRParenLoc(readSourceLocation());
|
||||
}
|
||||
|
||||
void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc(
|
||||
|
||||
@@ -452,6 +452,9 @@ void TypeLocWriter::VisitAutoTypeLoc(AutoTypeLoc TL) {
|
||||
Record.AddTemplateArgumentLocInfo(TL.getTypePtr()->getArg(I).getKind(),
|
||||
TL.getArgLocInfo(I));
|
||||
}
|
||||
Record.push_back(TL.isDecltypeAuto());
|
||||
if (TL.isDecltypeAuto())
|
||||
Record.AddSourceLocation(TL.getRParenLoc());
|
||||
}
|
||||
|
||||
void TypeLocWriter::VisitDeducedTemplateSpecializationTypeLoc(
|
||||
|
||||
@@ -2130,9 +2130,9 @@ void i();
|
||||
// CHECK-NEXT: "tokLen": 8
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: "end": {
|
||||
// CHECK-NEXT: "offset": 705,
|
||||
// CHECK-NEXT: "col": 11,
|
||||
// CHECK-NEXT: "tokLen": 8
|
||||
// CHECK-NEXT: "offset": 718,
|
||||
// CHECK-NEXT: "col": 24,
|
||||
// CHECK-NEXT: "tokLen": 1
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: },
|
||||
// CHECK-NEXT: "type": {
|
||||
|
||||
@@ -90,7 +90,7 @@ struct T {};
|
||||
|
||||
template <decltype(auto)>
|
||||
// CHECK: ClassTemplateDecl 0x{{[^ ]*}} <line:[[@LINE-1]]:1, line:[[@LINE+2]]:11> col:8 U
|
||||
// CHECK-NEXT: NonTypeTemplateParmDecl 0x{{[^ ]*}} <line:[[@LINE-2]]:11> col:25 'decltype(auto)' depth 0 index 0
|
||||
// CHECK-NEXT: NonTypeTemplateParmDecl 0x{{[^ ]*}} <line:[[@LINE-2]]:11, col:24> col:25 'decltype(auto)' depth 0 index 0
|
||||
struct U {};
|
||||
|
||||
template <typename Ty>
|
||||
|
||||
@@ -242,6 +242,13 @@ TEST(TypeLoc, DecltypeTypeLocRange) {
|
||||
verify(Target2->getSourceRange(), Code.range("full2"));
|
||||
}
|
||||
|
||||
TEST(TypeLoc, AutoTypeLocRange) {
|
||||
RangeVerifier<TypeLoc> Verifier;
|
||||
Verifier.expectRange(1, 1, 1, 14);
|
||||
EXPECT_TRUE(Verifier.match("decltype(auto) a = 1;", typeLoc(loc(autoType())),
|
||||
Lang_CXX11));
|
||||
}
|
||||
|
||||
TEST(TypeLoc, LongDoubleRange) {
|
||||
RangeVerifier<TypeLoc> Verifier;
|
||||
Verifier.expectRange(1, 1, 1, 6);
|
||||
|
||||
Reference in New Issue
Block a user